dir(re.compile(pattern))
gibt kein Muster als eines der Elemente der Liste zurück. Es gibt nämlich zurück:
['__copy__', '__deepcopy__', 'findall', 'finditer', 'match', 'scanner', 'search', 'split', 'sub', 'subn']
Laut Handbuch soll es enthalten
die Namen der Attribute des Objekts, die Namen der Attribute seiner Klasse und rekursiv die Attribute der Basisklassen seiner Klasse.
Es sagt auch das
Die Liste ist nicht unbedingt vollständig.
Gibt es einen Weg, um die zu bekommen vollständige Liste zu erhalten? Ich habe immer angenommen, dass dir eine vollständige Liste zurückgibt, aber anscheinend nicht ...
Außerdem: Gibt es eine Möglichkeit, nur Attribute aufzulisten? Oder nur Methoden?
Bearbeiten: Dies ist eigentlich ein Fehler in Python -> angeblich ist es im 3.0-Zweig behoben (und vielleicht auch in 2.6)
dir()
oder das Inspect-Modul ist im Allgemeinen der richtige Weg, dies zu tun. Haben Sie dasre
Modul nur als Beispiel verwendet oder möchten Sie ein spezielles Ziel erreichen?__dir__()
Antworten:
Für die vollständige Liste der Attribute lautet die kurze Antwort: Nein. Das Problem ist, dass die Attribute tatsächlich als die Argumente definiert sind, die von der
getattr
integrierten Funktion akzeptiert werden . Da der Benutzer erneut implementieren kann__getattr__
und plötzlich jede Art von Attribut zulässt, gibt es keine generische Möglichkeit, diese Liste zu generieren. Diedir
Funktion gibt die Schlüssel im__dict__
Attribut zurück, dh alle Attribute, auf die zugegriffen werden kann, wenn die__getattr__
Methode nicht erneut implementiert wird.Für die zweite Frage macht es nicht wirklich Sinn. Eigentlich sind Methoden aufrufbare Attribute, nichts weiter. Sie können jedoch aufrufbare Attribute filtern und mithilfe des
inspect
Moduls die Klassenmethoden, -methoden oder -funktionen bestimmen.quelle
Aus diesem Grund wurde die neue
__dir__()
Methode in Python 2.6 hinzugefügtsehen:
quelle
__dir
__ () ist eine Methode auf Objekt, keine Funktion - bitte lesen Sie die Links in der Antwort und diespprint({k:getattr(ojb,k) for k in obj.__dir__()})
Hier ist eine praktische Ergänzung zu den Antworten von PierreBdR und Moe:
dir()
scheint genug zu sein.Für Klassen im alten Stil können wir zumindest das tun, was ein Standardmodul tut, um die Tab-Vervollständigung zu unterstützen: zusätzlich zu
dir()
, suchen Sie nach__class__
und wählen Sie dann Folgendes__bases__
:(Testcode und Ausgabe werden der Kürze halber gelöscht, aber im Grunde genommen scheinen wir für Objekte neuen Stils dieselben Ergebnisse zu haben
get_object_attrs()
wie fürdir()
, und für Klassen alten Stilsdir()
scheint die Hauptaddition zur Ausgabe das__class__
Attribut zu sein.)quelle
Nur zur Ergänzung:
dir()
ist die am meisten mächtig / grundlegende Instrument. ( Am meisten empfohlen )Andere Lösungen als
dir()
nur die Möglichkeit , die Ausgabe von zu verarbeitendir()
.Wenn Sie Attribute der 2. Ebene auflisten oder nicht, ist es wichtig, das Sieben selbst durchzuführen, da Sie manchmal interne Variablen mit führenden Unterstrichen heraussieben möchten
__
, aber manchmal benötigen Sie möglicherweise die__doc__
Dokumentzeichenfolge.__dir__()
unddir()
gibt identischen Inhalt zurück.__dict__
unddir()
sind anders.__dict__
gibt unvollständigen Inhalt zurück.WICHTIG :
__dir__()
Kann manchmal vom Autor für einen beliebigen Zweck mit einer Funktion, einem Wert oder einem Typ überschrieben werden.Hier ist ein Beispiel:
TypeError: Der Deskriptor
__dir__
des'object'
Objekts benötigt ein ArgumentDer Autor von PyTorch hat die
__dir__()
Methode so geändert , dass ein Argument erforderlich ist. Diese Änderung schlägtdir()
fehl.Wenn Sie möchten, dass ein zuverlässiges Schema alle Attribute eines Objekts durchläuft, denken Sie daran, dass jeder Python-Standard überschrieben werden kann und möglicherweise nicht gilt und jede Konvention möglicherweise unzuverlässig ist.
quelle
So mache ich das, nützlich für einfache benutzerdefinierte Objekte, denen Sie ständig Attribute hinzufügen:
Gegeben ein Objekt, das mit
obj = type("Obj",(object,),{})
oder einfach erstellt wurde:Fügen Sie einige Attribute hinzu:
So erhalten Sie ein Wörterbuch mit nur den benutzerdefinierten Attributen:
quelle