Wie Bekomme ich den Namen des Moduls an die Klasse eines Objekts Definition Eher Als Modul-Namen der Objekt-Instanziierung?
In python 2.5, ich habe den folgenden code in ein Modul namens modtest.py:
def print_method_module(method):
def printer(self):
print self.__module__
return method(self)
return printer
class ModTest():
@print_method_module
def testmethod(self):
pass
if __name__ == "__main__":
ModTest().testmethod()
Jedoch, wenn ich diesen starte, druckt er aus:
__main__
Ist, wenn ich eine zweite Datei namens modtest2.py und führen Sie es:
import modtest
if __name__ == "__main__":
modtest.ModTest().testmethod()
Dieser druckt:
modtest
Wie kann ich den Dekorator immer ausdrucken modtest
, der name des Moduls, in dem die Klasse definiert ist?
InformationsquelleAutor Brent Newey | 2010-02-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Beim ausführen eines python-source-Datei direkt den Namen des Moduls an, die Datei ist
__main__
, auch wenn es bekannt ist von einem anderen Namen, wenn Sie Sie ausführen einige andere Datei und importieren Sie es.Werden Sie wahrscheinlich wollen, zu tun, wie du getan hast in modtest2, und importieren Sie das Modul mit der definition der Klasse nicht ausgeführt werden, sondern die Datei direkt. Sie können aber auch den Dateinamen des Hauptprogramms wie so, für Ihre diagnostischen Zwecke:
Ich bin mir nicht sicher, dass Sie tun können, die genau mit jeder Leichtigkeit. Sie konnte ungefähren es zu Fuß bis der Verzeichnisbaum (beginnend mit dem Verzeichnis der
__file__
) und Suche nach Dateien mit dem Namen__init__.py
im einzelnen, zu stoppen, wenn Sie nichts finden, und dann Einmaischen der Pfad-Segmente zusammen mit Punkten. Ich würde erwarten, dass dies Verschieden von der wahren full-Modul-Pfad in einigen Fällen.Diese Methode könnte funktionieren, aber für zwei python-Module, die von unbekannten Zusammenhang ist es möglich, zu erhalten, das Verzeichnis der Datei?
InformationsquelleAutor Matt Anderson
Ich vermute, Sie könnte verwenden Sie die sys._getframe() Hack zu bekommen, was Sie wollen.
Der Dekorator genannt worden ist aus dem Gültigkeitsbereich der Klasse, obwohl, so dass ich denke, man kann immer noch etwas zu tun gibt...
sys._getframe().f_code.co_filename funktioniert bis zu einem Punkt, aber ich habe nur noch den Dateinamen des Moduls, nicht der vollständige Pfad.
Verwenden Sie os.Pfad.abspath() auf?
InformationsquelleAutor djc