


Explication détaillée de l'opération d'affectation arithmétique améliorée '-='
Recommandations d'apprentissage associées : Tutoriel Python
Préface
Cet article est une série d'articles sur la syntaxe Python Sugar One. Le dernier code source peut être trouvé dans le projet desugar (github.com/brettcannon…
Introduction
Python a quelque chose appelé 增强算术赋值
(affectation arithmétique augmentée). Peut-être que vous n'êtes pas familier avec this Le nom est en fait une affectation lors d'opérations mathématiques. Par exemple, a -= b est l'affectation arithmétique améliorée de la soustraction
L'affectation améliorée a été ajoutée dans Python 2.0 (Traduction : dans PEP- Introduit en 203) <.>
Analyse-=
Parce que Python ne permet pas l'écrasement de l'affectation, donc par rapport à d'autres opérations avec des méthodes spéciales/magiques, la façon dont il implémente l'affectation améliorée peut être différente de ce que vous imaginez. exactement la même chose que Tout d'abord, sachez que est sémantiquement la même chose que a -= b
mais sachez aussi que si vous savez à l'avance que vous souhaitez attribuer un nom de variable à un objet, ce sera différent que a = a-b
. Les opérations aveugles de 🎜> peuvent être plus efficaces a - b
, il essaiera d'appeler a.__isub__(b). Si le résultat de l'appel est NotImplemented, ou s'il n'y a aucun résultat, Python reviendra au binaire normal. arithmétique.Opération : a -= b
(Traduction : L'article de l'auteur sur les opérations binaires, la traduction est ici)
En fin de compte, quelle que soit la méthode utilisée, la valeur de retour sera attribuée à un ci-dessous. est un simple pseudocode, a - b
se décompose en :
# 实现 a -= b 的伪代码if hasattr(a, "__isub__"): _value = a.__isub__(b) if _value is not NotImplemented: a = _value else: a = a - b del _value else: a = a - b复制代码
Induction de ces méthodes
Puisque nous avons déjà implémenté des opérations arithmétiques binaires, il n'est pas trop compliqué d'induire des opérations arithmétiques améliorées 🎜. >a -= b
En passant une fonction d'opération arithmétique binaire et en effectuant une certaine introspection (et en gérant les TypeErrors possibles), cela peut être clairement résumé comme :
def _create_binary_inplace_op(binary_op: _BinaryOp) -> Callable[[Any, Any], Any]: binary_operation_name = binary_op.__name__[2:-2] method_name = f"__i{binary_operation_name}__" operator = f"{binary_op._operator}=" def binary_inplace_op(lvalue: Any, rvalue: Any, /) -> Any: lvalue_type = type(lvalue) try: method = debuiltins._mro_getattr(lvalue_type, method_name) except AttributeError: pass else: value = method(lvalue, rvalue) if value is not NotImplemented: return value try: return binary_op(lvalue, rvalue) except TypeError as exc: # If the TypeError is due to the binary arithmetic operator, suppress # it so we can raise the appropriate one for the agumented assignment. if exc._binary_op != binary_op._operator: raise raise TypeError( f"unsupported operand type(s) for {operator}: {lvalue_type!r} and {type(rvalue)!r}" ) binary_inplace_op.__name__ = binary_inplace_op.__qualname__ = method_name binary_inplace_op.__doc__ = ( f"""Implement the augmented arithmetic assignment `a {operator} b`.""" ) return binary_inplace_op复制代码
Cela rend le -= support_ create_binary_inplace_op(__ sub__) défini , et peut déduire d'autres choses : le nom de la fonction, comment la fonction __i*__ est appelée et laquelle appeler lorsqu'une opération arithmétique binaire tourne mal
J'ai trouvé que presque personne n'utilise
<🎜. >Lors de l'écriture du code de cet article, j'ai rencontré un bug de test étrange avec **=. Parmi tous les tests garantissant que __pow__ serait appelé de manière appropriée, il y en avait un. Le cas d'utilisation échoue pour le
. module dans la bibliothèque standard Python. Mon code est généralement correct, et s'il y a des différences entre le code et celui de CPython, cela signifie généralement que je fais quelque chose de mal.**=
Cependant, peu importe le soin avec lequel j'ai fouillé le code, je n'ai pas pu déterminer pourquoi mes tests ont réussi mais la bibliothèque standard a échoué.
J'ai décidé de regarder de plus près ce qui se passe sous le capot de CPython. À partir du bytecode démonté : operator
>>> def test(): a **= b... >>> import dis>>> dis.dis(test) 1 0 LOAD_FAST 0 (a) 2 LOAD_GLOBAL 0 (b) 4 INPLACE_POWER 6 STORE_FAST 0 (a) 8 LOAD_CONST 0 (None) 10 RETURN_VALUE复制代码
dans la boucle eval :
case TARGET(INPLACE_POWER): { PyObject *exp = POP(); PyObject *base = TOP(); PyObject *res = PyNumber_InPlacePower(base, exp, Py_None); Py_DECREF(base); Py_DECREF(exp); SET_TOP(res); if (res == NULL) goto error; DISPATCH(); }复制代码
Source : github.com/python/cpyt…
Alors trouvez
:PyObject *PyNumber_InPlacePower(PyObject *v, PyObject *w, PyObject *z){ if (v->ob_type->tp_as_number && v->ob_type->tp_as_number->nb_inplace_power != NULL) { return ternary_op(v, w, z, NB_SLOT(nb_inplace_power), "**="); } else { return ternary_op(v, w, z, NB_SLOT(nb_power), "**="); } }复制代码
INPLACE_POWER
Source : github.com/python/cpyt…Poussa un soupir de soulagement~ Le code montre que si __ipow__ est défini, il sera appelé, mais __pow__ n'est appelé que s'il n'y a pas de __ipow__.
Cependant, l'approche correcte devrait être : PyNumber_InPlacePower()
Si quelque chose ne va pas lors de l'appel de __ipow__ et renvoie NotImplemented ou ne revient pas du tout, alors __pow__ et __rpow__ doivent être appelés.
Pour l'instant, il semble que cela sera corrigé dans Python 3.10, nous devons également ajouter un avis concernant **= étant bogué dans la documentation pour 3.8 et 3.9 (le problème est peut-être là depuis longtemps , mais il est plus ancien. La version Python est déjà en mode maintenance de sécurité uniquement, la documentation ne changera donc pas).
Le code corrigé ne sera probablement pas porté, car il s'agit d'un changement sémantique, et il est difficile de dire si quelqu'un s'est accidentellement appuyé sur la sémantique problématique. Mais il a fallu tellement de temps pour que ce problème soit remarqué, ce qui suggère que **= n'est pas largement utilisé, sinon le problème aurait été découvert il y a longtemps.Si vous souhaitez en savoir plus sur la programmation, faites attention à la rubrique
Formation php!
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

PHP et Python ont leurs propres avantages et inconvénients, et le choix dépend des besoins du projet et des préférences personnelles. 1.Php convient au développement rapide et à la maintenance des applications Web à grande échelle. 2. Python domine le domaine de la science des données et de l'apprentissage automatique.

Activer l'accélération du GPU Pytorch sur le système CentOS nécessite l'installation de versions CUDA, CUDNN et GPU de Pytorch. Les étapes suivantes vous guideront tout au long du processus: CUDA et CUDNN Installation détermineront la compatibilité de la version CUDA: utilisez la commande NVIDIA-SMI pour afficher la version CUDA prise en charge par votre carte graphique NVIDIA. Par exemple, votre carte graphique MX450 peut prendre en charge CUDA11.1 ou plus. Téléchargez et installez Cudatoolkit: visitez le site officiel de Nvidiacudatoolkit et téléchargez et installez la version correspondante selon la version CUDA la plus élevée prise en charge par votre carte graphique. Installez la bibliothèque CUDNN:

Docker utilise les fonctionnalités du noyau Linux pour fournir un environnement de fonctionnement d'application efficace et isolé. Son principe de travail est le suivant: 1. Le miroir est utilisé comme modèle en lecture seule, qui contient tout ce dont vous avez besoin pour exécuter l'application; 2. Le Système de fichiers Union (UnionFS) empile plusieurs systèmes de fichiers, ne stockant que les différences, l'économie d'espace et l'accélération; 3. Le démon gère les miroirs et les conteneurs, et le client les utilise pour l'interaction; 4. Les espaces de noms et les CGROUP implémentent l'isolement des conteneurs et les limitations de ressources; 5. Modes de réseau multiples prennent en charge l'interconnexion du conteneur. Ce n'est qu'en comprenant ces concepts principaux que vous pouvez mieux utiliser Docker.

Python et JavaScript ont leurs propres avantages et inconvénients en termes de communauté, de bibliothèques et de ressources. 1) La communauté Python est amicale et adaptée aux débutants, mais les ressources de développement frontal ne sont pas aussi riches que JavaScript. 2) Python est puissant dans les bibliothèques de science des données et d'apprentissage automatique, tandis que JavaScript est meilleur dans les bibliothèques et les cadres de développement frontaux. 3) Les deux ont des ressources d'apprentissage riches, mais Python convient pour commencer par des documents officiels, tandis que JavaScript est meilleur avec MDNWEBDOCS. Le choix doit être basé sur les besoins du projet et les intérêts personnels.

Minio Object Storage: Déploiement haute performance dans le système Centos System Minio est un système de stockage d'objets distribué haute performance développé sur la base du langage Go, compatible avec Amazons3. Il prend en charge une variété de langages clients, notamment Java, Python, JavaScript et GO. Cet article introduira brièvement l'installation et la compatibilité de Minio sur les systèmes CentOS. Compatibilité de la version CentOS Minio a été vérifiée sur plusieurs versions CentOS, y compris, mais sans s'y limiter: CentOS7.9: fournit un guide d'installation complet couvrant la configuration du cluster, la préparation de l'environnement, les paramètres de fichiers de configuration, le partitionnement du disque et la mini

La formation distribuée par Pytorch sur le système CentOS nécessite les étapes suivantes: Installation de Pytorch: La prémisse est que Python et PIP sont installés dans le système CentOS. Selon votre version CUDA, obtenez la commande d'installation appropriée sur le site officiel de Pytorch. Pour la formation du processeur uniquement, vous pouvez utiliser la commande suivante: pipinstalltorchtorchVisionTorChaudio Si vous avez besoin d'une prise en charge du GPU, assurez-vous que la version correspondante de CUDA et CUDNN est installée et utilise la version Pytorch correspondante pour l'installation. Configuration de l'environnement distribué: la formation distribuée nécessite généralement plusieurs machines ou des GPU multiples uniques. Lieu

Lors de l'installation de Pytorch sur le système CentOS, vous devez sélectionner soigneusement la version appropriée et considérer les facteurs clés suivants: 1. Compatibilité de l'environnement du système: Système d'exploitation: Il est recommandé d'utiliser CentOS7 ou plus. CUDA et CUDNN: La version Pytorch et la version CUDA sont étroitement liées. Par exemple, Pytorch1.9.0 nécessite CUDA11.1, tandis que Pytorch2.0.1 nécessite CUDA11.3. La version CUDNN doit également correspondre à la version CUDA. Avant de sélectionner la version Pytorch, assurez-vous de confirmer que des versions compatibles CUDA et CUDNN ont été installées. Version Python: branche officielle de Pytorch

CENTOS L'installation de Nginx nécessite de suivre les étapes suivantes: Installation de dépendances telles que les outils de développement, le devet PCRE et l'OpenSSL. Téléchargez le package de code source Nginx, dézippez-le et compilez-le et installez-le, et spécifiez le chemin d'installation AS / USR / LOCAL / NGINX. Créez des utilisateurs et des groupes d'utilisateurs de Nginx et définissez les autorisations. Modifiez le fichier de configuration nginx.conf et configurez le port d'écoute et le nom de domaine / adresse IP. Démarrez le service Nginx. Les erreurs communes doivent être prêtées à prêter attention, telles que les problèmes de dépendance, les conflits de port et les erreurs de fichiers de configuration. L'optimisation des performances doit être ajustée en fonction de la situation spécifique, comme l'activation du cache et l'ajustement du nombre de processus de travail.
