Autoload in Python
Habe ich In der Vergangenheit verwendet, perl AUTOLOAD-Einrichtung für die Umsetzung von lazy loading von Symbolen in einem namespace, und wollte die gleiche Funktionalität in python.
Traditionell ist die nächstgelegene Sie zu sein scheinen in der Lage zu erhalten, ist die Verwendung einer Klasse und einer __getattr__
Klasse zu erreichen, diese Art der Sache. Aber ich hab auch schon versucht herumkramen in sys.modules
, und kommen mit diesem:
# mymod.py
def greet(greeting="Hello World"):
print greeting
class autoload(object):
def __init__(self, __name__):
super(autoload, self).__init__()
self.wrapped_name = __name__
self.wrapped = sys.modules[__name__]
def __getattr__(self, name):
try:
return getattr(self.wrapped, name)
except AttributeError:
def f():
greet(name+" "+self.wrapped_name)
return f
if __name__ != "__main__":
import sys
sys.modules[__name__] = autoload(__name__)
Dies funktioniert der Art, wie ich möchte aus der Sicht der Nutzer:
~> python
Python 2.5.1 (r251:54863, Jan 10 2008, 18:01:57)
[GCC 4.2.1 (SUSE Linux)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import mymod
>>> mymod.hello()
hello
>>> from mymod import Hello_World
>>> Hello_World()
Hello_World
Aber es fällt mir auf - gibt es ein standard-Ansatz, dass Menschen dazu neigen, zu verwenden für autoloading in python?
Zweitens, eine Frage für erfahrene python-Entwickler wirklich ist "dieser Streik Sie als gute oder schlechte Praxis"? Ich bin ein halbwegs erfahrener python Entwickler, und es erscheint mir als wirklich nützlich, aber es scheint mir als grenzwertig und interessieren, ob diese angesehen werden können als gute Praxis, schlechte Praxis oder ähnliches.
Dank!
- stackoverflow.com/questions/2447353/getattr-on-a-module und die stackoverflow.com/questions/922550/...
- Würd ich löschen, wenn ich könnte, denn die Veränderungen, die auf die Frage text und den code und die tags nicht mehr unbedingt meine ursprüngliche Frage. Die nachfolgenden Antworten sind nicht besonders hilfreich, entweder. Ich wünschte, die Leute würden tatsächlich Fragen vor dem Wechsel die Frage von jemandem text. Zum Beispiel, der Grund, der ursprüngliche code verwendete "__name__" anstatt "mod_name" ist, zu zeigen, die direkte ähnlichkeit zu sys.Module[__name__] und so weiter. Dieser wurde gebrochen durch die Bearbeitungen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Antwort auf die Frage nach der Verwendung einer Klasse als Modul:
Ja, die Funktionalität ist nicht zufällig. Es wurde dort seit Anfang der 2.x-Serie und arbeitet immer noch in der 3.x-Serie.
Antwort auf die Frage von lazy loading:
Gibt es mehrere Möglichkeiten, es zu tun, und jede ist ein bisschen geheimnisvoll. Mit einem Modul-Imitator ist eine feine Methode.
"Faul importiert" werden konnte, baut auf den "importieren " Haken" angegeben PEP-302, und nun vollständig umgesetzt. PEP 369 dient zur Abdeckung "fauler Importe" sowie die post-import-Haken, aber da wurde vereinfacht und umfasst nur die post-import-Haken; noch, Sie könnten daran interessiert sein, die original-Entwurf.
Eine gute Umsetzung von "lazy-Importe" über die
meta_path
Haken finden Sie in dieses Rezept.Nein, ich glaube nicht, dass das nützlich ist.
Warum erstellen Sie eine Funktion, on-the-fly für jeder Attribut, das Sie versuchen zu bekommen aus dem Modul? Scheint verwirrend für mich. Es scheint, dass neue Funktionen entstehen durch Magie so muss man sich tief in die Durchführung zu verstehen, was Los ist. Und das alles für keine syntaktische Vorteile.
Und selbst wenn, Sie hatten einen guten Grund, das zu tun, warum tun Sie es mit einem Modul? Warum registrieren Sie Ihre Klasse Instanz in
sys.modules
? Ich denke, dass die Dinge erscheinen, was Sie nicht ist verpönt in python.Es sei denn, Sie sind Verschleierung von code auf Zweck, ich sehe nicht ein, warum würde man alles tun, dass.