web-dev-qa-db-fra.com

Qu'est-ce que l'envoi dynamique et la dactylographie?

Lors de l'utilisation de Pycharm, une erreur est souvent signalée:

'Nom' de référence non résolu. Cette inspection détecte les noms qui devraient résoudre mais ne pas. En raison de l'envoi dynamique et de la frappe à l'aide de canards , il s'agit de possible dans un nombre de cas limité mais utile. Niveau supérieur et les éléments de niveau classe sont mieux pris en charge que les éléments d'instance.

J'ai fouillé à ce sujet, mais la plupart des questions et informations que je trouve concernent le fait d'empêcher l'affichage du message. ce que je veux savoir c'est:

  • Qu'est-ce que la dactylographie dynamique/canard?
  • Quels sont (ou un exemple de) ces "nombre utile de cas"?
4
Rick M.

Python utilise une convention de frappe de canard. Cela signifie que vous n'avez pas à spécifier le type d'un nom. Contrairement à Java, par exemple, vous devez spécifier explicitement que cette variable peut être de type int ou Object. Essentiellement, la vérification de type est effectuée au moment de l'exécution.

"Si ça marche comme un canard et que ça crie comme un canard, alors ça doit être un canard."

En Python, tout semblera fonctionner jusqu'à ce que vous utilisiez, essayez de manipuler un objet d'une manière qui n'y est pas destinée. Fondamentalement, un objet peut ne pas avoir une méthode ou un attribut particulier, et vous ne le découvrirez pas tant que Python n'aura pas généré d'erreur en l'essayant.

Dynamic Dispatch est la pratique du compilateur ou de l'environnement qui choisit la version d'une fonction polymorphe à utiliser au moment de l'exécution. Si vous avez plusieurs implémentations d'une méthode, vous pouvez les utiliser de différentes manières, même si les méthodes ont des propriétés/attributs identiques ou similaires. Voici un exemple:

class Foo:
   def flush():
       pass

class Bar:
    def flush():
       pass

Les deux classes ont une méthode flush() mais le nom correct est choisi au moment de l'exécution.

Python n'est pas le meilleur exemple de ce processus car les méthodes peuvent prendre plusieurs paramètres et ne doivent pas être réimplémentées. Java est un meilleur exemple, mais je ne le maîtrise pas suffisamment pour donner un exemple correct.

3
smallpants

L'avertissement signifie que vous utilisez une variable que PyCharm ne reconnaît pas, mais en raison de la nature dynamique de Python, il est impossible de savoir si c'est correct ou si vous avez raison.

Par exemple, vous pouvez avoir le code suivant:

class myClass():

    def myfunc(self):
        print(self.name)

PyCharm se plaindra probablement que self.name ne peut pas être résolu. Cependant, vous pouvez utiliser la classe comme ceci:

my_class = myClass()
my_class.name = "Alastair"
my_class.myfunc()

ce qui est parfaitement valide (quoique fragile).

Le message poursuit en disant qu'il est plus confiant quant aux attributs et aux méthodes moins ambigus. Par exemple:

class myClass():
    my_instance_var = "Al"

    def myfunc(self):
        print(self.my_instance_var)

Comme my_instance_var est défini dans le code source (un attribut de classe), PyCharm peut être sûr qu'il existe.

(N'utilisez pas d'attributs de classe à moins de savoir ce que vous faites!)

1
Alastair McCormack