2009-09-04 3 views
9

Sie hätten bereits durch meine Verwendung der Terminologie herausgefunden, dass ich ein Python n00b bin.Liste der Methoden für Python Shell?

straight forward Frage:

Wie kann ich eine Liste der Methoden für ein bestimmtes Objekt in einer interaktiven Python-Shell zu sehen, wie ich in Ruby kann (was Sie tun können, dass in Ruby irb mit‘.methods' nach dem Objekt)?

Antwort

17

Bestehende Antworten machen einen guten Job, den Sie zeigen, wie die Attribute eines Objekts zu erhalten, aber nicht beantworten genau die Frage, die Sie gestellt - wie die Methoden erhalten eines Objekts. Python-Objekte haben einen einheitlichen Namespace (anders als in Ruby, wo Methoden und Attribute unterschiedliche Namespaces verwenden). Betrachten Sie zum Beispiel:

>>> class X(object): 
... @classmethod 
... def clame(cls): pass 
... @staticmethod 
... def stame(): pass 
... def meth(self): pass 
... def __init__(self): 
...  self.lam = lambda: None 
...  self.val = 23 
... 
>>> x = X() 
>>> dir(x) 
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', 
'__getattribute__', '__hash__', '__init__', '__module__', 
'__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', 
'__sizeof__', '__str__', '__subclasshook__', '__weakref__', 
'clame', 'lam', 'meth', 'stame', 'val'] 

((Ausgabe-Split für Lesbarkeit)).

Wie Sie sehen, ist dies die Namen aller Attribute geben - darunter viele spezielle Methoden, die von object nur vererbt werden, Attribute spezielle Daten wie __class__, __dict__ und __doc__, pro Instanz Datenattribute (val) , pro Instanz ausführbare Attribute (lam), sowie tatsächliche Methoden.

Falls und wenn Sie brauchen mehr selektiv zu sein, versuchen Sie:

>>> import inspect 
>>> [n for n, v in inspect.getmembers(x, inspect.ismethod)] 
['__init__', 'clame', 'meth'] 

Standard-Bibliotheksmodul inspect ist der beste Weg, Selbstbeobachtung in Python zu tun: es baut auf dem eingebauten in Selbstbeobachtung Haken (z als dir und fortgeschrittenere), um Ihnen nützliche, reichhaltige und einfache Introspektionsdienste anzubieten. Hier sehen Sie beispielsweise, dass nur Instanz- und Klassenmethoden angezeigt werden, die speziell von dieser Klasse entworfen wurden - keine statischen Methoden, keine Instanzattribute, ob aufrufbar oder nicht, keine speziellen Methoden, die von object übernommen wurden. Wenn Ihre Selektivitätsanforderungen etwas anders sind, können Sie einfach Ihre eigene optimierte Version von ismethod erstellen und als zweites Argument von getmembers übergeben, um die Ergebnisse genau auf Ihre Bedürfnisse abzustimmen.

8

dir(object)

finden Sie die Liste geben.

zum Beispiel:

a = 2 
dir(a) 

werden alle Methoden auflisten off Sie für eine ganze Zahl nennen kann.

+0

funktioniert! danke – potlee

2

tun:

dir(obj) 
5
>>> help(my_object) 
+1

Das ist eigentlich nicht richtig. help wird verwendet, um die Docstring-Dokumentation für eine Methode anzuzeigen. z.B. Hilfe (string.upper). dir (obj) ist was benötigt wird. – mikej

+0

Richtig. Wenn etwas wie .methods in Ruby benötigt wird, ist dir (...) die richtige Antwort. –

+0

Für die interaktive Nutzung (Anwendungsfall des OP) ist dies der beste Ansatz. Das Hilfesystem druckt die Dokumentation für mein Objekt aus, einschließlich einer Liste aller beworbenen Methoden (unabhängig davon, ob sie einen eigenen Docstring haben oder nicht). Es werden keine Methoden mit Namen angezeigt, die mit "_" beginnen, aber das ist normalerweise in Ordnung, da solche Methoden für den internen Gebrauch der Klasse gedacht sind. – alexis

2

Andere haben dir erwähnt. Lassen Sie mich eine Bemerkung der Vorsicht machen: Python-Objekte können eine __getattr__-Methode definiert haben, die aufgerufen wird, wenn man versucht, eine undefinierte Methode für dieses Objekt aufzurufen. Offensichtlich listet dir nicht alle diese (unendlich viele) Methodennamen auf. Einige Bibliotheken verwenden dieses Merkmal explizit, z. PLY (Python Lex-Yacc).

Beispiel:

>>> class Test: 
...  def __getattr__(self, name): 
...   return 'foo <%s>' % name 
... 
>>> t = Test() 
>>> t.bar 
'foo <bar>' 
>>> 'bar' in dir(t) 
False 
+0

... und die Ruby-Analogie aus der Frage weiterführt, könnte eine Ruby-Klasse method_missing außer Kraft gesetzt haben, die aufgerufen wird, wenn versucht wird, eine undefinierte Methode aufzurufen, und natürlich obj.methods nicht über beabsichtigte Methodennamen wissen kann durch method_missing behandelt werden. – mikej

+0

@mikej: danke! Ich habe keine Erfahrung mit Ruby, aber als ich meine Antwort schrieb, kam mir in den Sinn, dass Ruby die gleiche Funktionalität haben sollte. – Stephan202

0

Wenn Sie nur Methoden wollen, dann

def methods(obj): 
    return [attr for attr in dir(obj) if callable(getattr(obj, attr))] 

Aber ausprobieren IPython, hat es Tabulatorvervollständigung für Objektattribute, so obj.<tab> zeigt Ihnen eine Liste der verfügbaren Eingabe Attribute für dieses Objekt.

+0

im Leerlauf unterstützt Tab-Vervollständigung sowie – SilentGhost

4

Python unterstützt Tabulatorvervollständigung als Gut. Ich bevorzuge meine Python-Eingabeaufforderung sauber (also nein danke an IPython), aber mit Tab-Vervollständigung.

-Setup in .bashrc oder ähnlich:

PYTHONSTARTUP=$HOME/.pythonrc 

Setzen Sie dieses in .pythonrc:

try: 
    import readline 
except ImportError: 
    print ("Module readline not available.") 
else: 
    print ("Enabling tab completion") 
    import rlcompleter 
    readline.parse_and_bind("tab: complete") 

Es wird "Aktivieren Tabulatorvervollständigung" jedes Mal, wenn der Python-Prompt startet drucken, weil es besser ist, explizit sein. Dies beeinträchtigt nicht die Ausführung von Python-Skripts und -Programmen.


Beispiel:

>>> lst = [] 
>>> lst. 
lst.__add__(   lst.__iadd__(   lst.__setattr__(
lst.__class__(  lst.__imul__(   lst.__setitem__(
lst.__contains__(  lst.__init__(   lst.__setslice__(
lst.__delattr__(  lst.__iter__(   lst.__sizeof__(
lst.__delitem__(  lst.__le__(   lst.__str__(
lst.__delslice__(  lst.__len__(   lst.__subclasshook__(
lst.__doc__   lst.__lt__(   lst.append(
lst.__eq__(   lst.__mul__(   lst.count(
lst.__format__(  lst.__ne__(   lst.extend(
lst.__ge__(   lst.__new__(   lst.index(
lst.__getattribute__( lst.__reduce__(  lst.insert(
lst.__getitem__(  lst.__reduce_ex__( lst.pop(
lst.__getslice__(  lst.__repr__(   lst.remove(
lst.__gt__(   lst.__reversed__(  lst.reverse(
lst.__hash__   lst.__rmul__(   lst.sort(
+1

+1 Tab-Vervollständigung macht die Standard-Eingabeaufforderung viel angenehmer; Ich weiß nicht, warum es nicht standardmäßig aktiviert ist. Sie können den Code auch in Ihre sitecustomize.py einfügen, wenn Sie vermeiden möchten, dass Sie eine STARTUP-Anweisung ausführen müssen (obwohl Sie in diesem Fall die Ausdrucke weglassen würden). Beachten Sie, dass Windows- und Mac-Benutzer standardmäßig keine Readline-Funktion haben und ein entsprechendes Modul wie pyreadline (Win) oder readline.py (Mac) herunterladen müssen. – bobince

+0

Mit sitecustomize.py kann es Python-Anwendungen beeinflussen, während PYTHONSTARTUP in .bashrc so macht, dass es nur readline importiert, wenn es von der Kommandozeile gestartet wird. Dies ist, wenn ich sitecustomize.py richtig verstehe. – u0b34a0f6ae

+0

Es wird, ja, wenn sie [raw_] input() verwenden. Dies ist im Allgemeinen eher eine nützliche Sache, als etwas zu vermasseln. – bobince

4

Seine einfache tun dies für jedes Objekt, das Sie

dir(object) 

es eine Liste aller Attribute des Objekts wird wieder angelegt haben.