问题描述
我想从一个函数中获取一个字典,该函数将函数参数作为键,将默认值作为值。
我使用inspect.getfullargspec()
来获取参数列表和默认值列表。然后,我尝试使用dict(zip())
创建这些列表的字典。这是可行的,但前提是每个参数都具有默认值。如果没有默认值,那么一切都会变得混乱(按预期)。
例如,如果参数没有默认值,如何添加None
作为值。
还是其他想法?
这是代码:
def fn(name,age=18):
pass
spec = getfullargspec(fn)
args = spec.args
defaults = spec.defaults
zipped = dict(zip(args,defaults))
解决方法
由于非默认参数必须始终位于左侧(因为非默认参数不能在默认参数之后出现),因此您可以计算所需的填充量,然后将其添加到默认值的前面:
def func(a,b=1,c=2,*args,**kwargs):
pass
spec = getfullargspec(func)
padded_defaults = (None,) * (len(spec.args) - len(spec.defaults)) + spec.defaults
zipped = dict(zip(spec.args,padded_defaults)) # {'a': None,'b': 1,'c': 2}
(len(spec.args) - len(spec.defaults))
计算需要多少左填充,然后使用“序列乘法”((None,) *
)生成该填充。 + spec.defaults
然后将填充连接到现有默认值的左侧。
在某些特殊情况下,此可能会中断;尽管我想不到这种情况。由于元组串联,这也不是很有效,但是在99%的情况下,这可能不是问题。
在arg-> default存储在任何地方之间似乎都没有映射,因此似乎最好的选择是根据每个参数的数量推断出哪些参数具有默认值。