Namen des "Eltern"-Moduls herausfinden

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
BlackJack

@snafu: Das ist alles viel zu viel Magie. Das heraufhangeln des Framestack zum Beispiel sollte nicht in Produktivcode verwendet werden. Es gibt auch eine entsprechende Warnung im Docstring der Funktion. Das ist was für die Fehlersuche oder wenn man einen Debugger schreiben will.

Vom ersten mal importieren habe ich immer gesprochen weil Du *ursprünglich* wissen wolltest von wo Dein Modul importiert wird. Der Quelltext im Modul wird aber nur ausgeführt, wenn es *das erste mal* importiert wird. Jetzt hast Du Deine Anforderungen plötzlich geändert und möchtest wissen von welchem Modul aus eine Funktion aufgerufen wird. Das ist ja nun etwas anderes, weil man das natürlich öfter machen kann. Aber wie gesagt nicht sollte.

Und es funktioniert halt einfach nicht. Beispiel: Das Modul `spam` existiert nicht:

Code: Alles auswählen

import modcheck, sys
missing = modcheck.check_file(check_caller=True)
if missing:
    print '...'
import spam, eggs
In der ersten Zeile wird Dein `modcheck` importiert. Dann wird die `check_file()`-Funktion aufgerufen, die das aufrufende Modul importiert. Da das *der zweite* ``import``ist , passiert gar nix. Wenn die `check_file()` zurück kehrt kommen wir nach dem ``if`` zum ``import spam, eggs`` und da kracht es dann ganz normal, also so wie Du das nicht haben möchtest, und ohne das Dein Modul irgend etwas gebracht hätte.

Mir ist aber auch nicht ganz klar wie Du in der `check_file()` mehr als einen Importfehler erkennen können willst!? Denn auch da könntest Du mit einem ``except ImportError`` ja nur den ersten Fehler abfangen.
lunar

snafu hat geschrieben:
lunar hat geschrieben:

Code: Alles auswählen

import inspect
frame = inspect.currentframe().f_back
calling_mod_name = frame.f_globals['__name__']
print calling_mod_name
Super, danke dir. :)
Dir ist aber schon klar, dass sowas nichts in Produktivcode zu suchen hat?
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

BlackJack hat geschrieben:

Code: Alles auswählen

import modcheck, sys
missing = modcheck.check_file(check_caller=True)
if missing:
    print '...'
import spam, eggs
In der ersten Zeile wird Dein `modcheck` importiert. Dann wird die `check_file()`-Funktion aufgerufen, die das aufrufende Modul importiert. Da das *der zweite* ``import``ist , passiert gar nix.
check_file() soll nicht das aufrufende Modul importieren, sondern die Funktion soll herausfinden, welche weiteren Module innerhalb des aufrufenden Moduls verwendet werden und diese testen.

Und dass man dies nich im Produktivcode verwenden soll, wusste ich nicht. Habe inspect.currentframe.__doc__ vorher nicht gelesen. Warum soll das denn nicht verwendet werden?
lunar

snafu hat geschrieben:Und dass man dies nich im Produktivcode verwenden soll, wusste ich nicht. Habe inspect.currentframe.__doc__ vorher nicht gelesen. Warum soll das denn nicht verwendet werden?
Weil es tiefe Magie ist, unleserlich und unwartbar ist, und je nach Situation zu mysteriösen Fehlern führen kann. Es ist schlicht und einfach "kein guter Code".
BlackJack

@snafu: Wie willst Du denn herausfinden welche anderen Module innerhalb eines Moduls verwendet werden? Ohne das Modul auszuführen!?

Code: Alles auswählen

try:
    import psyco
    psyco.full()
except ImportError:
    pass

try:
    from lxml import etree
except ImportError:
    try:
        from xml.etree import ElementTree as etree
    except ImportError:
        from elementtree import ElementTree as etree

if 'linux' in sys.platform:
    from linux_specific import foobar
else:
    def foobar():
        import zzz
        zzz.bla()
Welche Module werden hier importiert? Welche davon werden zwingend gebraucht? Wie sieht Dein Code aus, *das* heraus zu finden!? Viel Spass. :-)
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Ja, ok. :( ^^
Antworten