为什么inspect.getargspec()返回未大小的对象?

时间:2014-07-11 14:59:38

标签: python

我正在使用inspect模块,并注意到它不时返回未经过处理的对象。例如inspect.getargspec(func)[3]返回元组?函数参数的默认值。当您在上一个代码段上使用len()时,您无法获得未经过大小调整的对象的长度。

为什么这是一个未实现的对象?

2 个答案:

答案 0 :(得分:2)

如果你这样做

import inspect
def f(a,b,c,*d): pass

a = inspect.getargspec(f)

你得到的结果就像

ArgSpec(args=['a', 'b', 'c'], varargs='d', keywords=None, defaults=None)
那个男人是什么人?这个对象显然有一个长度(len(a) = 4),我可以得到[3]

>>> a[3]
>>>

咦?那是什么?

>>> repr(a[3])
'None'
>>>

啊,它是None。确定。

让我们再看看:

>>> list(a)
[['a', 'b', 'c'], 'd', None, None]

似乎ArgSpec对象就像一个名字元组;其[3]defaults值,仅为None

这完全取决于你尝试用这个对象做什么。

答案 1 :(得分:0)

>>> def f(x, y=1, z=2, *args, **kwargs): pass
>>> getargspec(f)
ArgSpec(args=['x', 'y', 'z'], varargs='args', keywords='kwargs', defaults=(1, 2))

>>> def g(x, y, z): pass
>>> getargspec(g)
ArgSpec(args=['x', 'y', 'z'], varargs=None, keywords=None, defaults=None)

如果没有默认值,那么默认值为None而不是空元组。

如果您需要测试是否存在默认参数,而不是使用len,只需使用对象本身。

例如

if getargspec(g)[3]:
    ...

或更好:

if getargspec(g).defaults:
    ...