__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.xtest.y 的可能子模块。做这个处理的code首先使用hasattr,测试test是否已经有xy属性:

elif not hasattr(module, x):
    ...

并且 hasattr 负责第一个 __getattr__('x')__getattr__('y') 调用。

第二个 __getattr__('x')__getattr__('y') 调用正是您所期望的,为导入检索 test.xtest.y


您的 __getattr__ 不应该 return 特殊属性的值,例如 __path__.

此外,无关紧要,将模块命名为 test 是个坏主意,因为标准库已经为 Python's own test suite.

声明了该名称