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

1 投票
2 回答
2029 浏览
提问于 2025-04-18 12:57

我在使用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:
    ...

撰写回答