排除__builtin__模块

Phi*_*ipp -1 python-module built-in python-3.x

__builtin__Python中的杂波模块开发,有很多的函数和类具有非常通用名称命名空间(例如max,sum,id,hash,往往得到变量命名的方式,当一个上下文感知IDE之外的人可以意外覆盖一个等)名字没有注意到.

有没有办法阻止从某个文件隐式访问此模块并需要显式导入?

有点像:

from __builtins__ import hash as builtin_hash

hash = builtin_hash(foo)
Run Code Online (Sandbox Code Playgroud)

我知道这是不好的做法.

wim*_*wim 6

您可以简单地删除__builtins__Python用于查找内置命名空间的名称:

>>> del __builtins__
>>> max
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'max' is not defined
Run Code Online (Sandbox Code Playgroud)

警告:如果你在其他人的命名空间中执行此操作,他们会讨厌你.

......而且需要明确的导入?

请注意,使用builtins解析import语句;)

>>> del __builtins__
>>> from builtins import max
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: __import__ not found
Run Code Online (Sandbox Code Playgroud)

...非常通用的名称(例如max,sum,id,hash等)经常妨碍命名变量,当在上下文感知IDE之外时,可能会意外地覆盖名称而不会注意到

您将只创建一个隐藏名称的局部变量.如果你是在有限的范围内进行的话,这实际上是无关紧要的,尽管它仍然是糟糕的形式(可读性计数).

# this shadows built-in hash function in this namespace ... meh?
hash = '38762cf7f55934b34d179ae6a4c80cadccbb7f0a'

# this stomps built-in hash ... not a honking great idea!
import builtins
builtins.hash = lambda obj: -1
Run Code Online (Sandbox Code Playgroud)

最佳实践:

  • 使用上下文感知编辑器,它会为您提供名称冲突的波浪线下划线,或
  • 使用Python足够长,你知道内置的名字(严重!)
  • 通过使用同义词(例如checksum)或在名称上附加尾随下划线来避免名称阴影(例如hash_)

  • 我主要是为了警告. (4认同)
  • 需要注意以下几点:首先,即使你先显式设置`__import__ = __import__`,这也会导致`__import__`不可用,从而打破`import`语句; 我相信`__import__`需要通过`__builtins__`找到.其次,你应该解释一下`__builtins__`和`builtins` /`__builtin__`之间的关系. (3认同)
  • @PhilippPloder真的.它适用于CPython和PyPy,但可能不适用于Python 3的其他0个主要实现.:) (3认同)
  • 或者,换句话说:他试图通过故意使"哈希"无法访问来实现无意中使"哈希"无法访问的问题,实际上并没有做任何事情.这是他解决问题的事情,他不需要第二步的第一步. (3认同)
  • 根据[Python docs](https://docs.python.org/2/library/__builtin__.html),`__ builtin__`是一个CPython实现细节 (2认同)