PyCharm程序__all__生成和语法突出显示

时间:2019-01-30 11:34:59

标签: python pycharm static-analysis

我正在使用此装饰器以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错误,这是可以理解的,因为它不会在分析之前运行代码。但这是一个明显的不便。

您将如何解决(或可能已经解决)?

我的假设

  • 添加一些自动的linter插件或更改现有的PyCharm的检查代码。
  • 实际上正在编辑.py源的某些方法是可行的,但不可行。
  • 这种方法可能不是最好的方法,因此建议另一种处理出口的便捷技术也很好。

1 个答案:

答案 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__中,因此自动执行此操作会有所帮助。