正如其他人所说,在Python中,哲学是允许用户“误用”东西,而不是试图想象和防止误用,因此没有任何东西是内置的。但是,由于Python非常开放,可以让您以有限的方式实现类似于您所说的,的东西*.您可以用对象替换某些变量名称空间字典,这些对象将防止覆盖您最喜欢的变量。(当然,如果这以出乎意料的方式破坏了您的任何代码,您将得到这两个部分。)
为此,您需要使用^{}、^{}、^{}、或^{},或者重写^{}。这些允许您提供对象,这些对象应该像字典一样,用于存储变量。通过子类化dict,我们可以创建一个“更安全”的替换字典:class SafeGlobals(dict):
def __setitem__(self, name, value):
if hasattr(__builtins__, name) or name == '__builtins__':
raise SyntaxError('nope')
return super(SafeGlobals, self).__setitem__(name, value)
my_globals = SafeGlobals(__builtins__=__builtins)
将my_globals设置为当前命名空间,设置如下变量:x = 3
将转换为以下内容:my_globals['x'] = 3
下面的代码将执行一个Python文件,对顶级名称空间使用我们的safer字典:execfile('safetyfirst.py', SafeGlobals(__builtins__=__builtins__))
例如code.interact():>>> code.interact(local=SafeGlobals(__builtins__=__builtins__))
Python 2.7.9 (default, Mar 1 2015, 12:57:24)
[GCC 4.9.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> x = 2
>>> x
2
>>> dict(y=5)
{'y': 5}
>>> dict = "hi"
Traceback (most recent call last):
File "", line 1, in
File "", line 4, in __setitem__
SyntaxError: nope
*不幸的是,这种方法非常有限。它只会阻止重写顶级命名空间中的内置项。您可以自由重写其他命名空间中的内置项:>>> def f():
... set = 1
... return set
...
>>> f()
1