dir(re.compile(pattern))
ne renvoie pas de motif comme l'un des éléments des listes. À savoir, il renvoie:
['__copy__', '__deepcopy__', 'findall', 'finditer', 'match', 'scanner', 'search', 'split', 'sub', 'subn']
Selon le manuel, il est censé contenir
les noms des attributs de l'objet, les noms des attributs de sa classe et récursivement des attributs des classes de base de sa classe.
Il dit aussi que
La liste n'est pas nécessairement complète.
Existe-t-il un moyen d'obtenir la liste complète ? J'ai toujours supposé que dir renvoyait une liste complète mais apparemment ce n'est pas le cas ...
Aussi: existe-t-il un moyen de répertorier uniquement les attributs? Ou seulement des méthodes?
Edit: c'est en fait un bug en python -> soi-disant il est corrigé dans la branche 3.0 (et peut-être aussi en 2.6)
dir()
ou le module d'inspection est généralement la bonne façon de le faire. Avez-vous utilisé lere
module à titre d'exemple ou souhaitez-vous atteindre un objectif spécial?__dir__()
Réponses:
Pour la liste complète des attributs, la réponse courte est: non. Le problème est que les attributs sont réellement définis comme les arguments acceptés par la
getattr
fonction intégrée. Comme l'utilisateur peut réimplémenter__getattr__
, autorisant soudainement tout type d'attribut, il n'existe aucun moyen générique possible de générer cette liste. Ladir
fonction renvoie les clés de l'__dict__
attribut, c'est-à-dire tous les attributs accessibles si la__getattr__
méthode n'est pas réimplémentée.Pour la deuxième question, cela n'a pas vraiment de sens. En fait, les méthodes sont des attributs appelables, rien de plus. Vous pouvez cependant filtrer les attributs appelables et, à l'aide du
inspect
module, déterminer les méthodes, méthodes ou fonctions de classe.la source
C'est pourquoi la nouvelle
__dir__()
méthode a été ajoutée en python 2.6voir:
la source
__dir
__ () est une méthode sur un objet, pas une fonction - veuillez lire les liens dans la réponse et cecipprint({k:getattr(ojb,k) for k in obj.__dir__()})
Voici un complément pratique aux réponses de PierreBdR et Moe:
dir()
semble suffisant.Pour les classes à l'ancienne , nous pouvons au moins faire ce qu'un module standard fait pour prendre en charge la complétion des onglets: en plus de
dir()
rechercher__class__
, puis de rechercher__bases__
:(Le code de test et la sortie sont supprimés par souci de concision, mais fondamentalement, pour les objets de nouveau style, nous semblons avoir les mêmes résultats
get_object_attrs()
que pourdir()
et pour les classes de style ancien, l'ajout principal à ladir()
sortie semble être l'__class__
attribut.)la source
Uniquement pour compléter:
dir()
est l' outil le plus puissant / fondamental. (Le plus recommandé )Des solutions autres que
dir()
simplement fournir leur façon de traiter la sortie dedir()
.En listant les attributs de 2e niveau ou non, il est important de faire le filtrage par vous-même, car parfois vous voudrez peut-être filtrer les variables internes avec des soulignements
__
, mais parfois vous aurez peut-être besoin de la__doc__
chaîne de doc.__dir__()
etdir()
renvoie un contenu identique.__dict__
etdir()
sont différents.__dict__
renvoie un contenu incomplet.IMPORTANT :
__dir__()
peut parfois être écrasé par une fonction, une valeur ou un type, par l'auteur pour n'importe quel but.Voici un exemple:
TypeError: le descripteur
__dir__
de l''object'
objet a besoin d'un argumentL'auteur de PyTorch a modifié la
__dir__()
méthode en quelque chose qui nécessite un argument. Cette modificationdir()
échoue.Si vous voulez qu'un schéma fiable traverse tous les attributs d'un objet, n'oubliez pas que chaque norme pythonique peut être remplacée et peut ne pas tenir , et chaque convention peut ne pas être fiable.
la source
Voici comment je le fais, utile pour les objets personnalisés simples auxquels vous continuez d'ajouter des attributs:
Soit un objet créé avec
obj = type("Obj",(object,),{})
, ou simplement:Ajoutez quelques attributs:
puis, pour obtenir un dictionnaire avec uniquement les attributs personnalisés:
la source