Python 3.3でAlexの実装を使用しましたが、無残クラッシュ:AttributeError
が提起されなければならないので コード
def __getattr__(self, name):
return globals()[name]
は、KeyError
正しくないではありません。 イントロスペクションの多くは、インポート時に が行われているので、これは__path__
などの属性を探して、Pythonの3.3の直下に墜落し、__loader__
など
ここでは、怠惰な輸入のためにできるように、我々のプロジェクトに今使用バージョンがある モジュールで。
""" 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__)
モジュールは今のinit関数を定義する必要があります:モジュールの__init__
はない特別な名前を持っている最初の属性アクセス まで遅延されます。この関数は、自分自身をインポートするかもしれないモジュールをインポートする を使用することができる。
def __init__(module):
...
# do something that imports config.py again
...
コードが別のモジュールに入れることができ、それは特性上記例のように で拡張することができます。
多分それは誰かにとって役に立ちます。
それは絶対に華麗です。職場のマスター。 – wbg