Python interactive shell autocomplete在对象中显示了比使用_dir或_dict更多的方法__
使用Python3.4时,我注意到在交互式shell中,我可以按TAB键获取给定对象的方法列表。起初我以为这是一个新功能,但后来我意识到它只是在以前的版本中没有启用(至少在我的安装中)。所以我玩了一会儿,发现了一些奇怪的东西。在Python interactive shell autocomplete在对象中显示了比使用_dir或_dict更多的方法__,python,Python,使用Python3.4时,我注意到在交互式shell中,我可以按TAB键获取给定对象的方法列表。起初我以为这是一个新功能,但后来我意识到它只是在以前的版本中没有启用(至少在我的安装中)。所以我玩了一会儿,发现了一些奇怪的东西。在映射对象上使用此功能,我可以获得以下可用的属性\方法: >>> map.<TAB> map.__base__( map.__dir__( map.__hash__( map.__m
映射
对象上使用此功能,我可以获得以下可用的属性\方法:
>>> map.<TAB>
map.__base__( map.__dir__( map.__hash__( map.__mro__ map.__reduce_ex__( map.__text_signature__
map.__bases__ map.__doc__ map.__init__( map.__name__ map.__repr__( map.__weakrefoffset__
map.__basicsize__ map.__eq__( map.__instancecheck__( map.__ne__( map.__setattr__( map.mro(
map.__call__( map.__flags__ map.__itemsize__ map.__new__( map.__sizeof__(
map.__class__( map.__format__( map.__iter__( map.__next__( map.__str__(
map.__delattr__( map.__ge__( map.__le__( map.__prepare__( map.__subclasscheck__(
map.__dict__ map.__getattribute__( map.__lt__( map.__qualname__ map.__subclasses__(
map.__dictoffset__ map.__gt__( map.__module__ map.__reduce__( map.__subclasshook__(
我知道每个类都可以自由地实现\uuuuuu dir\uuuu
,不管它想要什么。。但是,我只是问自己,自动完成功能如何能够检索到比使用\uuuuuu dir\uuuuu
可见的方法更多的方法,以及是否有其他方法可以绕过\uuuuu dir\uuuu
来获取所有真正的方法
我知道不可能得到一个对象所有属性的真正完整列表,因为用户可以自由地实现\uuuu getattr\uuuu
,以字符串作为键。但是,大多数对象并没有那个复杂的行为,我真的很想模仿自动完成选项卡的行为
更新
因此,dir
的文档说明,如果它给定一个类对象,它将打印出它的属性和它的基属性(不包括它自己的\uuu class\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu属性,它是一个类型的对象)。这就是为什么dir
没有打印出属于类型的属性。但是,即使尝试通过dir(type)
获取type
的属性,我们也会得到一个额外的属性\uuuuuuAbstractMethods\uuuuuuuuu
,当尝试访问它时,它不是一个有效的属性(即type.\uuuuuuuuAbstractMethods\uuuuuu
==>AttributeError),而自动完成功能实际上并没有打印该属性。所以我在这里想弄清楚的是自动完成机制是如何工作的。在Python 3.3.5(linux)上,我得到:
看来autocomplete正在聚合这两个数据集
注意:这两个都可以从map
访问:
>>> map.__str__
<slot wrapper '__str__' of 'object' objects>
>>> map.__str__({})
'{}'
>>> map.__bases__
(<class 'object'>,)
这可以像这样使用:
print('\n'.join(autocomplete(map)))
在我使用Python3.3.5的机器上,这提供了自动完成示例中的所有内容,除了map.\uuuuu text\uu signature\uuuuuuu
,我怀疑这与我使用的Python版本有关
使用set
是因为item
和type(item)中存在重复的属性。好吧,您几乎得到了它,但是shell自动完成中缺少这些列表中的一个项--\uuuu abstractmethods\uuuu
属性(它实际上不是map
的有效属性)。这些列表中总共有44个项组合在一起(没有重复项),而在shell auto complete中有43个项。我发现了别的东西。。我可以调用object.\uuuuu dir\uuuuuu(map)
,它给了我一个包含42个属性的列表-自动完成建议的所有属性,但1个-下一个属性。这很奇怪。。。
>>> map.__str__
<slot wrapper '__str__' of 'object' objects>
>>> map.__str__({})
'{}'
>>> map.__bases__
(<class 'object'>,)
def autocomplete(item):
entries = set(dir(item))
entries |= set(dir(type(item)))
for attr in sorted(entries):
try:
a = getattr(item, attr)
if hasattr(a, '__call__'):
yield '%s.%s(' % (item.__name__, attr)
else:
yield '%s.%s' % (item.__name__, attr)
except AttributeError:
# Methods in `dir(x)` are allowed to raise `AttributeError`.
pass
print('\n'.join(autocomplete(map)))