Python >> Tutoriel Python >  >> Python

Méthode magique Python __dir__()

__dir__() de Python la méthode magique implémente la fonctionnalité du dir() fonction intégrée. Sémantiquement, dir() renvoie tous les noms (de fonction, d'objet ou de variable) dans une portée donnée . Cependant, la méthode magique __dir__() convertit toute valeur de retour en une liste triée.

Exemple minimal

Le code suivant définit une classe personnalisée My_Class et remplace le __dir__() méthode magique pour retourner une liste factice [1, 2, 3] en appelant le dir(x) un objet x de type My_Class .

class My_Class:
    def __dir__(self):
        return [1, 2, 3]


x = My_Class()
print(dir(x))
# [1, 2, 3]

Avant de plonger dans des exemples plus avancés, examinons le but du dir() fonction en premier !

Répertoire d'arrière-plan()

Si utilisé sans argument , le dir() intégré de Python function renvoie les noms de fonction et de variable définis dans la portée locale —l'espace de noms de votre module actuel.

Si utilisé avec un argument d'objet , dir(object) renvoie une liste de noms d'attributs et de méthodes définis dans la portée de l'objet .

Python __dir__() Sortie triée

La sortie de tout dir() l'appel de fonction doit être une liste triée (source). Même si vous le remplacez en définissant votre méthode magique personnalisée __dir__() , Python tentera de convertir votre sortie personnalisée en une liste triée.

Vous pouvez le voir dans l'exemple suivant où votre __dir__() personnalisé renvoie une liste non triée et Python la remet dans l'ordre !

class My_Class:
    def __dir__(self):
        return ['Bob', 'Alice', 'Carl']


x = My_Class()
print(dir(x))
# ['Alice', 'Bob', 'Carl']

La liste d'origine ['Bob', 'Alice', 'Carl'] a été automatiquement et implicitement converti dans la liste triée ['Alice', 'Bob', 'Carl'] .

Python __dir__() répertorie les éléments de type différent

Si __dir__() renvoie une liste avec des éléments de types différents, c'est-à-dire des types avec des opérateurs de comparaison incompatibles (< , > , <= , >= ), Python lèvera un TypeError: '<' not supported between instances of 'x' and 'y' .

class My_Class:
    def __dir__(self):
        return ['Bob', 'Alice', 42]


x = My_Class()
print(dir(x))

Sortie :

Traceback (most recent call last):
  File "C:\Users\...\code.py", line 7, in <module>
    print(dir(x))
TypeError: '<' not supported between instances of 'int' and 'str'

Pour corriger l'erreur, assurez-vous que tous les éléments de la liste ont des opérateurs de comparaison compatibles.

Vous pouvez accomplir cela en définissant les méthodes magiques __lt__ , __gt__ , __ge__ , et __le__ afin que la comparaison des divers types soit possible.

Alternativement, vous pouvez vous assurer que tous les éléments de la liste sont renvoyés par __dir__ sont du même type.