TL; DR:globals()[name]回退到“默认”的正确方法是什么?
我有大量从 YML 文件定义的动态创建的类。
动态类创建是通过PyYAMLyaml.safe_load_all和dataclasses.make_dataclass(3.7 中的新功能)的组合完成的。我希望这些类的规范偶尔会随着时间而改变,这就是为什么我选择 YML 作为一种易于理解的格式来描述它们。
Python 3.7 引入了新功能(参见 PEP 562):__getattr__用于管理模块属性访问的模块级函数(还有一个模块级__dir__函数)。使用这个新函数允许dataclass从模块命名空间导入每个动态创建的类会很方便,如下所示:
# some_module.py
from package_name import DataClassName1, DataClassName2
...就像这样:
# package_name/__init__
from .my_dataclasses import DynamicDataClassesDict
def __getattr__(name):
try:
return DynamicDataClassesDict[name]
except KeyError:
# fall back on default module attribute lookup
在阅读 PEP 562 时,我并不清楚如何回退到模块属性访问的默认功能。对于一堂课,只需调用super().__getattr__(*args). 我确实在其中一个示例中看到了这一行:
return globals()[f"_deprecated_{name}"]
这种方法似乎有效。globals()[name]回到“默认”的正确方法是什么?似乎不是,因为这globals()[name]会引发 aKeyError而不是预期的AttributeError。