我正在使用此装饰器以DRY方式管理__all__
:
def export(obj):
mod = sys.modules[obj.__module__]
if hasattr(mod, '__all__'):
mod.__all__.append(obj.__name__)
else:
mod.__all__ = [obj.__name__]
return obj
对于使用import *
导入的名称,PyCharm会发出unresolved reference
错误,这是可以理解的,因为它不会在分析之前运行代码。但这是一个明显的不便。
您将如何解决(或可能已经解决)?
我的假设:
.py
源的某些方法是可行的,但不可行。答案 0 :(得分:1)
您可能对管理__all__
的替代方法感兴趣:
https://pypi.org/project/auto-all/
这提供了start_all()
和end_all()
函数,可在您要访问的项目周围放置在模块中。这种方法适用于PyCharms代码检查。
from auto_all import start_all, end_all
# Imports outside the start and end function calls are not included in __all__.
from pathlib import Path
def a_private_function():
print("This is a private function.")
# Start defining externally accessible objects.
start_all(globals())
def a_public_function():
print("This is a public function.")
# Stop defining externally accessible objects.
end_all(globals())
我觉得这是管理__all__
的合理方法,也是我在更复杂的软件包中使用的一种方法。该软件包的源代码很小,因此可以轻松地将其直接包含在代码中,从而在需要时避免外部依赖。
我使用它的原因是我有一些模块,其中许多项目需要“导出”,并且我想将导入的项目排除在导出列表之外。我有多个开发人员正在处理代码,添加新项目很容易,而忘记将它们包含在__all__
中,因此自动执行此操作会有所帮助。