Python dir 内置命令不一致

Wil*_*man 3 python python-3.x

我想以编程方式检查 print 是否是内置的 Python 函数。

dir(__builtins__)从 Python 命令行查询时使用 Python 3.4.x我得到了我正在寻找的内容:

['ArithmeticError', 'AssertionError', ..... , 'pow', 'print' ... ]
Run Code Online (Sandbox Code Playgroud)

但是当在 .py 文件中使用它时:

import sys

def foo:
   print(dir(__builtins__))
Run Code Online (Sandbox Code Playgroud)

调用返回:

 ['__class__', '__contains__', '__delattr__', '__delitem__', '__dir__',
 '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__',
 '__getitem__', '__gt__', '__hash__', '__init__', '__iter__', '__le__',
 '__len__', '__lt__', '__ne__', '__new__', '__reduce__',
 '__reduce_ex__', '__repr__', '__setattr__', '__setitem__',
 '__sizeof__', '__str__', '__subclasshook__', 'clear', 'copy',
 'fromkeys', 'get', 'items', 'keys', 'pop', 'popitem', 'setdefault',
 'update', 'values']
Run Code Online (Sandbox Code Playgroud)

__builtins__在任何时候都没有重新定义。

Mar*_*ers 5

引用builtins模块文档

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

在命令提示符中,您正在查看模块对象,而不是__dict__在 python 文件中运行代码时的对象。的dir()一个词典的距离而不同dir()的模块对象上。

而不是看__builtins__,使用builtins模块:

import builtins

hasattr(builtins, 'print')
Run Code Online (Sandbox Code Playgroud)