In einer IPython-Sitzung definiere ich normalerweise benutzerdefinierte Funktionen ... Problem ist, manchmal möchte ich den tatsächlichen Code für diese Funktionen sehen. Bisher habe ich keine Möglichkeit gefunden, dies anzuzeigen. Verwenden? und ?? gibt einfach "Dynamisch generierte Funktion zurück. Kein Quellcode verfügbar." Gibt es eine Möglichkeit, Quellcode für benutzerdefinierte Funktionen anzuzeigen?Wie kann ich Quellcode für dynamisch erstellte ("benutzerdefinierte") Funktion in IPython anzeigen?
Wie kann ich Quellcode für dynamisch erstellte ("benutzerdefinierte") Funktion in IPython anzeigen?
Antwort
Versuchen Sie Geschichte:
In [22]: for l in _ih:
....: if l.startswith('def f'):
....: print l
....:
....:
def f():
a= 1
b = 2
return a*b
obwohl dies sehr einfach ist, eine bessere Version würde analysieren/run Geschichte und sehen, ob Sie eine Funktion zurück
bekommenWenn Sie die Quelle suchen eine interaktiv definierte Funktion können Sie die aktuelle Definition der es in ipython Geschichte finden:
[i for (i, l) in enumerate(_ih) if l.startswith('def foo(')][-1]
Dann Sie diese Zeile bearbeiten:
%edit 42
Es öffnet Notepad oder einen anderen Texteditor mit der Funktionsdefinition darin.
Oder Sie können in einer Datei speichern:
%save foo.py 42
Das funktioniert, obwohl ich in diesem speziellen Fall eine% -Paste verwendet habe, so dass alles, was es zeigte, der Befehl zum Einfügen von Magie für diese Zeile war. Gute Lösung ansonsten aber –
Ich verwende Python 2.7.4 und ipython 0.13.2.
kann ich die Quelle einer dynamisch erzeugten Funktion in ipython siehe ??
vor dem Funktionsnamen:
In [8]: ??sort_words
Type: function
String Form:<function sort_words at 0x189b938>
File: /tmp/ipython_edit_yc1TIo.py
Definition: sort_words(s)
Source:
def sort_words(s):
x = re.findall(r'\W+(\w+)', s)
x.sort()
for i in x:
print i
Vielleicht ist das jetzt in neueren Versionen von ipython zur Verfügung? Welche Version verwendest du?
ja das ist richtig; Ich habe diese Frage gestellt, als (ich denke) 0.12 nicht die stabile Version war, und diese war in 0.11 nicht verfügbar. Siehe Thomas Ks Kommentar zur Frage –
Fumctions in IPython gelten als dynamisch generiert, wenn:
sie metaprogrammed - sie von einer anderen Funktion erstellt werden. In diesem Fall gibt es keinen Quellcode, er existiert einfach nicht.
Sie werden in einem anderen Namespace referenziert, zu dem sie erstellt wurden, und es gibt keine Informationen darüber, in welchem Namespace sie sich ursprünglich befinden. In diesem Fall finden Sie heraus, wo sie ursprünglich waren und laufen ?? von dort.
Ich bin mir nicht sicher, ob ich deinen "meta-programmierten" Fall verstehe: in IPython 1.1.0, kann man mit '??' den Code von Funktionen sehen, die in einer anderen Funktion erzeugt werden ('def f(): def g(): ... gib g zurück). – EOL
Was macht die Funktion "benutzerdefiniert"? Können Sie eine Quelle angeben, die angibt, wie Sie sie erstellen? – kindall
so etwas wie: 'def blah (d, b): return (d> 10 und b <10)' (interaktiv definiert wäre besser gewesen, sorry) –
Welche Version von IPython haben Sie? In neueren Versionen funktioniert 'f ??' auf interaktiv definierten Funktionen. –