有没有一种方法可以保护Python中的内置函数?

6
我的问题源于这个问题,其中一个用户由于不知情地重新绑定了内置全局变量set而感到困惑。有没有一种直接的方式让Python在您尝试覆盖内置变量时发出警告呢?
我更具体地考虑了Mathematica。在Mathematica中,所有内置函数都有属性Protected。如果您尝试重新定义Set,它会告诉您SetProtected,并将其保持不变,这可能会在以后遇到应该正常工作但却无法正常工作的情况时为您节省大量的困扰。如果您确实严重想要重新定义Set,您仍然可以这样做--您只需要先Unprotect它。您还可以Protect您自己的符号,以保护它们免受意外重新定义的影响。
也许有经验的Python程序员不需要这个功能,但对像我这样的新手来说,有类似的功能会很好。(现在想想,我已经编程Mathematica 15年了,Protected仍然偶尔救了我的命。)

1
Python不会警告您设置与内置名称相同的变量名。这是您自己的责任。有时将变量命名为“id”是正确的选择,我不希望每次这样做时都收到有关内置函数id()的警告。 - Martijn Pieters
3
pylint 可以检测到这个问题,但只有关键字 (例如 deffor) 是被保护不可重新赋值的。 - jonrsharpe
1
如果你担心这种情况,可以使用一个代码检查工具;一个好的代码检查工具会警告你并提供更多帮助。 - Martijn Pieters
@HuStmpHrrr:如果有人已经重新绑定了这些名称,那么这实际上不会保护您的环境。最好使用__builtin__模块来引用内置模块。然而,这对OP没有帮助;他们担心会意外地遮蔽内置模块。 - Martijn Pieters
@MartijnPieters 好的,我没有理解问题。 - Jason Hu
1个回答

5
使用 http://www.pylint.org/
def set():
    pass

会生成以下警告:

[W0622, set] 重新定义内置的 'set'

您可以在编写文件后运行它,或者在使用 Vim 时使用它。大多数 IDE 也会生成此类信息。


谢谢,这很有帮助。我唯一看到的限制是它在交互式会话中不会有太多帮助。我想知道是否很难在ipython中添加某种自动化的代码检查? - Leon Avery

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接