__getattr__ 对于模块 运行 导入两次?
__getattr__ for module running twice on import?
我正在尝试 运行 使用 __getattr__
从模块导入对象时的一些逻辑,如下所述:__getattr__ on a module
...但是逻辑 运行s 两次。为什么会发生这种情况,我该如何阻止它?
main.py
from test import x, y
test.py
def __getattr__(name: str):
print(f"Imported {name}")
您的 __getattr__
returns None
所有属性,包括 __path__
,如果模块具有 __path__
属性,则将其视为包。
对于一个包,from test import x, y
需要处理名为 test.x
和 test.y
的可能子模块。做这个处理的code首先使用hasattr
,测试test
是否已经有x
和y
属性:
elif not hasattr(module, x):
...
并且 hasattr
负责第一个 __getattr__('x')
和 __getattr__('y')
调用。
第二个 __getattr__('x')
和 __getattr__('y')
调用正是您所期望的,为导入检索 test.x
和 test.y
。
您的 __getattr__
不应该 return 特殊属性的值,例如 __path__
.
此外,无关紧要,将模块命名为 test
是个坏主意,因为标准库已经为 Python's own test suite.
声明了该名称
我正在尝试 运行 使用 __getattr__
从模块导入对象时的一些逻辑,如下所述:__getattr__ on a module
...但是逻辑 运行s 两次。为什么会发生这种情况,我该如何阻止它?
main.py
from test import x, y
test.py
def __getattr__(name: str):
print(f"Imported {name}")
您的 __getattr__
returns None
所有属性,包括 __path__
,如果模块具有 __path__
属性,则将其视为包。
对于一个包,from test import x, y
需要处理名为 test.x
和 test.y
的可能子模块。做这个处理的code首先使用hasattr
,测试test
是否已经有x
和y
属性:
elif not hasattr(module, x):
...
并且 hasattr
负责第一个 __getattr__('x')
和 __getattr__('y')
调用。
第二个 __getattr__('x')
和 __getattr__('y')
调用正是您所期望的,为导入检索 test.x
和 test.y
。
您的 __getattr__
不应该 return 特殊属性的值,例如 __path__
.
此外,无关紧要,将模块命名为 test
是个坏主意,因为标准库已经为 Python's own test suite.