我正在使用inspect模块,并注意到它不时返回未经过处理的对象。例如inspect.getargspec(func)[3]
返回元组?函数参数的默认值。当您在上一个代码段上使用len()
时,您无法获得未经过大小调整的对象的长度。
为什么这是一个未实现的对象?
答案 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:
...