为什么inspect.getargspec()返回无大小对象?
我在使用inspect模块的时候,发现它有时候会返回一些没有大小的对象。比如,inspect.getargspec(func)[3]
这个代码会返回一个元组,里面是函数参数的默认值。当你对这个返回的结果使用len()
函数时,会出现一个错误,提示说无法获取一个没有大小的对象的长度。
那么,为什么这个对象没有大小呢?
2 个回答
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
。
这完全取决于你想用这个对象做什么。
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:
...