użyłem realizację Alex”na Python 3.3, ale to wywala marnie: Kod
def __getattr__(self, name):
return globals()[name]
nie jest poprawna, ponieważ AttributeError
powinien zostać podniesiony, a nie KeyError
. ten rozbił się zaraz pod Pythona 3.3, ponieważ wiele introspekcji odbywa podczas importu, szukając cech jak __path__
, __loader__
itp
Oto wersja, że używamy teraz w naszym projekcie, aby umożliwić leniwych importu w module.__init__
modułu jest opóźnione aż do pierwszego dostępu atrybutu że nie ma specjalną nazwę:
""" config.py """
# lazy initialization of this module to avoid circular import.
# the trick is to replace this module by an instance!
# modelled after a post from Alex Martelli :-)
Lazy module variables--can it be done?
class _Sneaky(object):
def __init__(self, name):
self.module = sys.modules[name]
sys.modules[name] = self
self.initializing = True
def __getattr__(self, name):
# call module.__init__ after import introspection is done
if self.initializing and not name[:2] == '__' == name[-2:]:
self.initializing = False
__init__(self.module)
return getattr(self.module, name)
_Sneaky(__name__)
Moduł teraz musi zdefiniować startowy funkcję. Funkcja ta może być stosowana importować moduły, które mogą się importowania:
def __init__(module):
...
# do something that imports config.py again
...
Kod może być wprowadzane do innego modułu, i może być rozszerzony o właściwościach jak w powyższych przykładach.
Może to jest przydatne dla kogoś.
To jest absolutnie genialne. Mistrz w pracy. – wbg