我希望这不是一个太愚蠢的问题 :-( 但为什么 __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 objectsCPython 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__))
