将所有模块方法和属性列为对象列表

时间:2017-09-25 09:01:27

标签: python python-2.7 python-3.x

我试图深入研究python并评估一些内置函数。 dir函数返回一个字符串列表,其中包含给定模块的所有属性的名称。 因此,如果我运行以下代码段,我会得到一个空列表:

import string
[x for x in dir(string) if callable(x) ]

是否有其他功能或其他方式,我可以与dir(string)结合使用以获取对象列表而不是行字符串?

我的目标是做一些事情:

import string
[ x for x in ***(dir(string)) if callable(x) ]

而不是dive in python book

中的示例
 methodList = [method for method in dir(object) if callable(getattr(object, method))]

2 个答案:

答案 0 :(得分:3)

这是因为dir()会返回字符串的列表:

>>> import string
>>> dir(string)
['Formatter', 'Template', '_ChainMap', '_TemplateMetaclass', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_re', '_string', 'ascii_letters', 'ascii_lowercase', 'ascii_uppercase', 'capwords', 'digits', 'hexdigits', 'octdigits', 'printable', 'punctuation', 'whitespace']

字符串值不可调用;这些不是实际的属性值,而是名称。

如果您想在string模块上将这些名称作为属性进行测试,则必须使用getattr(),或使用vars() function获取{{1}命名空间作为字典:

strings

此处的订单不同,因为dictionaries are unordered>>> getattr(string, 'Formatter') <class 'string.Formatter'> >>> callable(getattr(string, 'Formatter')) True >>> [name for name in dir(string) if callable(getattr(string, name))] ['Formatter', 'Template', '_ChainMap', '_TemplateMetaclass', 'capwords'] >>> [name for name, obj in vars(string).items() if callable(obj)] ['capwords', '_ChainMap', '_TemplateMetaclass', 'Template', 'Formatter'] 始终对返回值进行排序。对于模块dir()只返回dir(module)

如果您想要可调用对象本身而不是名称,只需过滤sorted(vars(module))字典的

vars()

答案 1 :(得分:-1)

callable(x)项检查x是一个具有__call__()方法的对象。在你的情况下,它没有,这就是为什么理解返回一个空列表