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.
Schreibe einen Kommentar