从/以函数参数为键创建字典,以值作为默认值

问题描述

我想从一个函数获取一个字典,该函数函数参数作为键,将认值作为值。

我使用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存储在任何地方之间似乎都没有映射,因此似乎最好的选择是根据每个参数的数量推断出哪些参数具有默认值。