Skip to main content
 首页 » 编程设计

python之Python __builtins__ 中缺少 __import__ (在 Django Shell 中时)

2025年05月04日23三少

我希望这不是一个太愚蠢的问题 :-( 但为什么 __import__ 没有包含在 inspect.getmembers(__builtins__) 中?

这是我尝试打印内置函数时得到的结果:

>>> sorted([name for (name,obj) in inspect.getmembers(__builtins__)]) 
['__class__', '__cmp__', '__contains__', '__delattr__', '__delitem__', '__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', 'has_key', 'items', 'iteritems', 'iterkeys', 'itervalues', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values', 'viewitems', 'viewkeys', 'viewvalues'] 

更新:

实际上,当我运行它时,我在 Django 1.6 shell 中。 ( python 2.7)。

单独在 Python 2.7 中运行它会包含 __import__。可能发生了什么?

请您参考如下方法:

来自文档:

27.3. __builtin__ — Built-in objects

CPython implementation detail: Most modules have the name __builtins__ (note the 's') made available as part of their globals. The value of __builtins__ is normally either this module or the value of this modules’s [sic] __dict__ attribute. Since this is an implementation detail, it may not be used by alternate implementations of Python.

在您的情况下,看起来您正在查看的 __builtins__ 是字典而不是模块(__builtin__.__dict__ 而不是 __builtin__ ).所以 inspect.getmembers 返回的是 dict 类的属性而不是键。相反,您可能需要如下内容:

if isinstance(__builtins__, dict): 
    names = sorted(__builtins__) 
else: 
    names = sorted(name for name, obj in inspect.getmembers(__builtins__)) 

或者:

import __builtin__ 
names = sorted(name for name, obj in inspect.getmembers(__builtin__))