Wie kann ich einen Bezug zu einem Modul innerhalb dieses Moduls erhalten? Wie kann ich einen Verweis auf das Paket erhalten, das dieses Modul enthält?Python: Wie bekomme ich einen Verweis auf ein Modul im Modul selbst?
Antwort
import sys
current_module = sys.modules[__name__]
außer dies wird nicht richtig sein, wenn das Modul neu geladen wird; Ich glaube nicht, dass es einen Ort gibt, an dem eine Referenz garantiert ist. Wenn das der Fall wäre, würde das Nachladen nicht wirklich funktionieren, oder? –
Reloading verwendet dasselbe Modulobjekt erneut; Es wird kein neues Modulobjekt erstellt, daher ist es immer noch korrekt, wenn es neu geladen wird. – bukzor
Wenn Sie eine Klasse in diesem Modul haben, dann ist die __module__
Eigenschaft der Klasse ist der Modulname der Klasse. Somit können Sie über sys.modules[klass.__module__]
auf das Modul zugreifen. Dies funktioniert auch für Funktionen.
Eigentlich scheint es (zumindest) für eine Funktion, die '__module__' Eigenschaft ist kein Modul, sondern eine Zeichenfolge; daher schlägt eine 'inspect.getabsfile (func .__ modul __)' mit "_TypeError: 'os' ist kein Modul, Klasse, Methode, Funktion, Traceback, Frame oder Code Objekt_"; während 'inspect.getabsfile (sys.modules [o .__ modul __])' scheint zu bestehen. – sdaau
Danke, repariert es. – Michael
Sie können den Namen des aktuellen Moduls erhalten __name__
Das Modul Referenz verwendet, kann im sys.modules
Wörterbuch zu finden.
Siehe den Python documentation
Ich schätze den Doc-Link. –
Eine weitere Technik, die nicht das sys-Modul nicht importiert werden, und wohl - nach Geschmack hängt - einfacher:
current_module = __import__(__name__)
Beachten Sie, kein Import. Python importiert jedes Modul nur einmal.
Dies scheint eine wirklich nette Möglichkeit zu sein, sys zu vermeiden. Abgesehen davon, dass das Lesen etwas kontraintuitiv ist, gibt es mögliche Nachteile bei diesem Ansatz? – JeremyDouglass
@ JeremyDouglass. Nicht dass ich wüsste. __import__ ist eine legitime, dokumentierte, eingebaute Funktion (die einzige Funktion __xx__). Sie können es durch das 'importlib' Paket ersetzen (Sie müssen es importieren). Vielleicht - mir ist das nie passiert - könnten Sie ein Problem mit dem relativen/absoluten Import haben, wenn ein Modul mit dem gleichen Namen in sys.path verfügbar ist. In diesem Fall können Sie es mit dem Argument 'level' der Funktion lösen. – Uri
Sie können es von außen passieren in:
mymod.init(mymod)
Nicht ideal, aber es funktioniert für meinen aktuellen Anwendungsfall.
- 1. Wie einen Verweis auf aktuelle Modul Attribute in Python bekommen
- 2. Wie installiere ich ein Modul auf Python?
- 3. Wie bekomme ich ein bestimmtes Python-Modul in Anaconda?
- 4. Warum bekomme ich einen Python ImportError: Kein Modul namens html_parser?
- 5. Verweis auf globale Variable von einem Modul
- 6. Wie bekomme ich angular.js Modul Wert von einem anderen Modul
- 7. Wie namentlich ES6 Modul Variable zuzugreifen (aus dem Modul selbst)
- 8. Ich bekomme ein Ahihelper-Modul von Dive in Python
- 9. Python: immer einen Verweis auf eine Funktion von innen selbst
- 10. ein Python-Modul
- 11. Wie bekomme ich das Uuid-Modul für Python 2.4.3
- 12. Wie ein Modul
- 13. Wie erweitere ich ein Python-Modul? (python-twitter)
- 14. Unload ein Modul in Python
- 15. installiert Modul auf Python-Editor
- 16. Wie bekomme ich RMSE von scipy.optimize.leastsq Modul
- 17. Wie Datenstruktur im Speicher von Modul zu Modul übergeben
- 18. Unbekannter Fehler im Python-Modul pptx add_picture
- 19. Kann ich ein selbst aktualisierendes Modul in Excel erstellen?
- 20. Installation win32gui Python-Modul
- 21. Python, wie in Modul
- 22. Wie bekomme ich einen Verweis auf ItemsPanel einer Silverlight ListBox
- 23. Wie importiere ich ein Modul in Python mit importlib.import_module
- 24. Wie konfiguriere ich einen Cron Job im Magento Modul?
- 25. Wie kompiliere ich ein Modul ohne einen EntryPoint? .
- 26. Wie erhalte ich das Dataset-Modul für Python im Einsatz?
- 27. Wie kann ein Python-Modul deinimportiert werden?
- 28. Wie konfiguriere ich einen Modul-Fallback-Pfad für ein bestimmtes Modul?
- 29. ensure_future nicht im Modul asyncio
- 30. Python No namens Modul
Ich vermute, Sie könnten diese Frage stellen, weil Sie eine Variable in ** Modul Umfang ** (zB BLAH = 10 außerhalb einer Funktion oder Klasse), dann eine ** Klasse/Funktion Variable ** namens BLAH und du willst unterscheiden. Eine gültige Frage hier ist: ** Ist das notwendig? ** Scope-Regeln sind notorisch anfällig für Fehler, vor allem durch die "Idiot", die Ihren Code nach Ihnen abholt (d. H. Sie, 6 Monate später). Tricks wie diese sind selten notwendig; Ich versuche, sie komplett zu vermeiden, weil sie später oft verwirrend und falsch modifiziert werden. –
@ KevinJ.Rice "der 'Idiot', der Ihren Code nach Ihnen abholt (d. H. Sie, 6 Monate später)" machte meinen Tag! – arctelix
Wen kümmert es, warum er die Frage stellt? Es gibt viele gute Gründe, dies zu tun. –