magischen Konstanten in Python?
Hallo Freunde, in PHP gibt es die sogenannten "magischen Konstanten", wie __FILE__, __LINE__ etc. Ich habe das immer gern zum Debuggen genutzt. Gibt es so etwa auch in Python? Mathias
Hi, On Tue, 30 Dec 2008 00:52:59 +0100 Mathias Uebel <mathias.uebel@meeloon.de> wrote:
in PHP gibt es die sogenannten "magischen Konstanten", wie __FILE__, __LINE__ etc. Ich habe das immer gern zum Debuggen genutzt. Gibt es so etwa auch in Python?
__name__ existiert ansonsten kann man über sys._getframe() fürs debuggen nützliche Informationen bekommen. Oder gleich spezielle logger verwenden, die automatisch solche Informationen in die Ausgabe einfügen. grüße, Marek
Hallo Mathias, On 2008-12-30 00:52, Mathias Uebel wrote:
in PHP gibt es die sogenannten "magischen Konstanten", wie __FILE__, __LINE__ etc. Ich habe das immer gern zum Debuggen genutzt. Gibt es so etwa auch in Python?
außer dem von Marek genannten __name__ gibt es auch noch __file__, das aber tatsächlich nur in Dateien definiert ist. Falls ein Modul schon einmal in Bytecode übersetzt wurde, kann __file__ aber auch eine .pyc-Datei bezeichnen:
import os os.__file__ '/usr/lib/python2.5/os.pyc'
Mit dem traceback-Modul [1] kommt man (auch unabhängig von einer vorher aufgetretenen Exception) an diverse Infos des Aufruf-Stacks. Zum Beispiel liefert die Datei ----- import pprint import traceback def f(unused): print "Stack:" traceback.print_stack() print print "The same information in another form:" stack = traceback.extract_stack() for file, line_number, function, call in stack: print "In file %s, %s, line %d, called %s" % \ (file, function, line_number, call) def g(): f("unused") g() ----- die Ausgabe ----- Stack: File "tb_test.py", line 19, in <module> g() File "tb_test.py", line 16, in g f("unused") File "tb_test.py", line 7, in f traceback.print_stack() The same information in another form: In file tb_test.py, <module>, line 19, called g() In file tb_test.py, g, line 16, called f("unused") In file tb_test.py, f, line 10, called stack = traceback.extract_stack() ----- Vielleicht ist auch noch das Modul inspect [2] interessant für dich. Hier sind noch einige andere besondere Variablen aufgelistet. [1] http://docs.python.org/library/traceback.html#module-traceback [2] http://docs.python.org/library/inspect.html#module-inspect Viele Grüße Stefan
Stefan Schwarzer schrieb:
Hallo Mathias,
Danke Stefan, Danke Marek, [...]
Vielleicht ist auch noch das Modul inspect [2] interessant für dich. Hier sind noch einige andere besondere Variablen aufgelistet.
Hier habe ich etwas gefunden: inspect.trace() Es ist einfach anzuwenden. Ach ... Ein gutes Neues an Alle! Mathias
Mathias Uebel <mathias.uebel@meeloon.de> writes:
Hallo Freunde,
in PHP gibt es die sogenannten "magischen Konstanten", wie __FILE__, __LINE__ etc. Ich habe das immer gern zum Debuggen genutzt. Gibt es so etwa auch in Python?
Mathias
Normalerweise benutze ich import inspect def curPos(frame=1): """Print functionname, filename and line at called position. """ co = sys._getframe(frame).f_code stack = inspect.stack()[frame] return "%s (%s @ %d)" % (co.co_name, stack[1], stack[2]) und print curPos() als Ersatz for __FILE__ and __LINE__ debug print statements. Berthold -- __ Address: G / \ L Germanischer Lloyd phone: +49-40-36149-7374 -+----+- Vorsetzen 35 P.O.Box 111606 fax : +49-40-36149-7320 \__/ D-20459 Hamburg D-20416 Hamburg
Berthold Höllmann schrieb:
Mathias Uebel <mathias.uebel@meeloon.de> writes:
Hallo Freunde,
in PHP gibt es die sogenannten "magischen Konstanten", wie __FILE__, __LINE__ etc. Ich habe das immer gern zum Debuggen genutzt. Gibt es so etwa auch in Python?
Mathias
Normalerweise benutze ich
import inspect
def curPos(frame=1): """Print functionname, filename and line at called position. """ co = sys._getframe(frame).f_code stack = inspect.stack()[frame] return "%s (%s @ %d)" % (co.co_name, stack[1], stack[2])
und
print curPos()
als Ersatz for __FILE__ and __LINE__ debug print statements.
Berthold
Hallo Berthold, ich habe mich auch für inspect entschieden: Es ist einfach zu Händeln. Dein Vorschlag ist genial. Danke
Berthold Höllmann schrieb:
Mathias Uebel <mathias.uebel@meeloon.de> writes:
Hallo Freunde,
in PHP gibt es die sogenannten "magischen Konstanten", wie __FILE__, __LINE__ etc. Ich habe das immer gern zum Debuggen genutzt. Gibt es so etwa auch in Python?
Mathias
Normalerweise benutze ich
import inspect
def curPos(frame=1): """Print functionname, filename and line at called position. """ co = sys._getframe(frame).f_code stack = inspect.stack()[frame] return "%s (%s @ %d)" % (co.co_name, stack[1], stack[2])
und
print curPos()
als Ersatz for __FILE__ and __LINE__ debug print statements.
Berthold
Hallo Berthold, ich habe mir das noch einmal angesehen: Hat einen Grund, warum sys.getframe(frame) bemüht wird? Denn inspect.stack()[frame] hat diese Information doch auch. return "%s (%s @ %d)" % (stack[3], stack[1], stack[2]) Mathias
Mathias Uebel <mathias.uebel@meeloon.de> writes:
Berthold Höllmann schrieb:
Mathias Uebel <mathias.uebel@meeloon.de> writes:
Hallo Freunde,
in PHP gibt es die sogenannten "magischen Konstanten", wie __FILE__, __LINE__ etc. Ich habe das immer gern zum Debuggen genutzt. Gibt es so etwa auch in Python?
Mathias
Normalerweise benutze ich
import inspect
def curPos(frame=1): """Print functionname, filename and line at called position. """ co = sys._getframe(frame).f_code stack = inspect.stack()[frame] return "%s (%s @ %d)" % (co.co_name, stack[1], stack[2])
und
print curPos()
als Ersatz for __FILE__ and __LINE__ debug print statements.
Berthold
Hallo Berthold,
ich habe mir das noch einmal angesehen:
Hat einen Grund, warum sys.getframe(frame) bemüht wird? Denn inspect.stack()[frame] hat diese Information doch auch.
return "%s (%s @ %d)" % (stack[3], stack[1], stack[2])
Es gibt keinen speziellen Grund. Es kann allenfalls sein, das ich curPos schon vor 2.1 nutzte, und es ispect da noch nicht gab. beim upgrade habe ich stack[3] dann übersehen. Gruß Berthold
Mathias
_______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
-- A: Weil es die Lesbarkeit des Textes verschlechtert. F: Warum ist TOFU so schlimm? A: TOFU F: Was ist das größte Ärgernis im Usenet?
participants (5)
-
berthold@despammed.com
-
bhoel@despammed.com
-
Marek Kubica
-
Mathias Uebel
-
Stefan Schwarzer