跨越相同python版本的不同副本的行为不一致

时间:2017-09-08 02:54:42

标签: python

我最近玩了下面这段代码:

print(getattr(__builtins__, "__import__")("random"))

在我的本地Python版本上,它似乎按预期工作:

<module 'random' from 'C:\\Users\\lkfjsa\\Programs\\Python3.6.1\\lib\\random.py'>

我的版本是:

Python 3.6.1 (v3.6.1:69c0db5, Mar 21 2017, 18:41:36) [MSC v.1900 64 bit (AMD64)] on win32

然后我继续在repl.it上尝试相同的事情:Code Here

我能找到的关于该版本的最多信息是:

Python 3.6.1 (default, Dec 2015, 13:05:11)
[GCC 4.8.2] on linux

然后给出这个输出:

Traceback (most recent call last):
  File "python", line 1, in <module>
AttributeError: 'dict' object has no attribute '__import__'

我绝对感到困惑......有人在乎解释吗?

2 个答案:

答案 0 :(得分:3)

由于可能是由于repl.it的沙盒实施或其他内容,因此__builtins__的版本实际上是dict

   type(__builtins__)
=> <class 'dict'>
   __builtins__['__import__']
=> <built-in function __import__>
   __builtins__['__import__']('random')
=> <module 'random' from '/usr/local/lib/python3.6/random.py'>

答案 1 :(得分:2)

名称__builtins__的值是一个实现细节:

  

作为实现细节,大多数模块都将名称__builtins__作为其全局变量的一部分提供。 __builtins__的值通常是此模块[builtins模块]或此模块的__dict__属性的值。由于这是一个实现细节,因此Python的替代实现可能不会使用它。

https://docs.python.org/3/library/builtins.html