Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python interactive shell autocomplete在对象中显示了比使用_dir或_dict更多的方法___Python - Fatal编程技术网

Python interactive shell autocomplete在对象中显示了比使用_dir或_dict更多的方法__

Python interactive shell autocomplete在对象中显示了比使用_dir或_dict更多的方法__,python,Python,使用Python3.4时,我注意到在交互式shell中,我可以按TAB键获取给定对象的方法列表。起初我以为这是一个新功能,但后来我意识到它只是在以前的版本中没有启用(至少在我的安装中)。所以我玩了一会儿,发现了一些奇怪的东西。在映射对象上使用此功能,我可以获得以下可用的属性\方法: >>> map.<TAB> map.__base__( map.__dir__( map.__hash__( map.__m

使用Python3.4时,我注意到在交互式shell中,我可以按TAB键获取给定对象的方法列表。起初我以为这是一个新功能,但后来我意识到它只是在以前的版本中没有启用(至少在我的安装中)。所以我玩了一会儿,发现了一些奇怪的东西。在
映射
对象上使用此功能,我可以获得以下可用的属性\方法:

>>> 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)))