我试图深入研究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) ]
中的示例
methodList = [method for method in dir(object) if callable(getattr(object, method))]
答案 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__()
方法的对象。在你的情况下,它没有,这就是为什么理解返回一个空列表