3

假设我有一个模块test.py

def foo():
   print "foo"

def bar():
   print "bar"

def _baz():
   print "_baz"

__all__ = ['foo']

和一个main.py

from test import foo, bar, _baz

foo()
bar()   # breaks module privacy
_baz()  # breaks module privacy

是否有任何用于 Python 的(静态)代码分析器工具可以捕获破坏隐私(bar_baz)暗示的导入__all__

我已经测试了 Pylint,但它也没有捕捉到。

另一个澄清:我不是在谈论__all__动态修改/填充和/或导入代码是动态的情况。只是静态可分析的代码情况。

4

1 回答 1

1

因为__all__' 的意图与隐私无关(它不是对导出内容的限制,它是一个分隔通配符导入的工具),Python 生态系统中不存在任何工具可以采用这种解释并跟踪未列出的名称的使用在__all__.

换句话说; __all__从来没有打算将导出名称的一部分作为公开的方式来祝福,就像_name前导下划线只是按照惯例私有而不强制执行一样。

于 2013-10-12T13:18:21.360 回答