<p>Python没有提供任何明显且简单的方法来阻止在函数中访问(未声明的)全局名称的原因之一是,在Python中,所有东西(至少可以分配给名称的所有东西)都是对象,包括函数、类和模块,因此阻止函数访问未声明的全局名称将有助于相当冗长的代码。。。嵌套作用域(闭包等)也没有帮助。你知道吗</p>
<p>当然,尽管globals是邪恶的,但有时仍然有合理的理由使一个global对象发生变异。FWIW,即使是过梁(至少是pylint和pyflakes)似乎也没有任何选择来检测这个AFAICT-但你必须自己仔细检查,因为我可能忽略了它,或者它可能作为pylint扩展或存在于另一个过梁中。你知道吗</p>
<p>奥托,我很少有错误来自这样的问题在20多年来(我不记得一个单一的发生实际上)。常规应用基本的良好实践——尽可能避免副作用的简短函数、有意义的名称和良好的命名约定等,至少对关键部分进行单元测试等——似乎足以有效地防止此类问题。你知道吗</p>
<p>这里的一个要点是,我有一个关于不可调用全局变量被视为(伪)常量的规则,它通过将它们全部命名为\u UPPER来表示。这使得它非常明显,当你真的变异或重新绑定一个。。。你知道吗</p>
<p>作为一个更一般的规则:Python本质上是一种非常动态的语言(见鬼,你甚至可以在运行时更改对象的类……),并且有一个“我们都是同意的成年人”的哲学,因此它确实“缺乏”了大多数安全保护,你可以在更多的“B&D”语言(如Java)中找到,而不是依赖于约定,良好的实践和常识。你知道吗</p>
<p>现在,Python不仅是动态的,而且还公开了它的许多内部内容,因此您当然可以(如果这还不存在的话)编写一个<a href="http://pylint.pycqa.org/en/latest/how_tos/custom_checkers.html" rel="nofollow noreferrer">pylint extension</a>,它至少可以检测函数代码中的全局名称(提示:您可以使用<code>yourfunc.co_code</code>(py2)或<code>yourfunc.__code__</code>(py3)访问<a href="https://docs.python.org/3/reference/datamodel.html#index-56" rel="nofollow noreferrer">the compiled code of a function object</a>,然后检查代码中使用的名称)。但是,除非你不得不面对一群草率、无纪律的开发人员(在这种情况下,你还有另一个问题——愚蠢没有技术解决方案),否则我非常谦虚的看法是你在浪费时间。你知道吗</p>