【问题标题】:Create dictionary from/with function arguments as keys and default values as value从/使用函数参数作为键和默认值作为值创建字典
【发布时间】:2021-02-03 09:03:26
【问题描述】:

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

我使用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))

【问题讨论】:

  • 回想一下,一旦位置参数被赋予了默认值,所有剩余的位置参数都必须具有默认值。如果您只考虑位置参数,您可以简单地将defaults 与None 相左。

标签: python function dictionary arguments default-value


【解决方案1】:

由于非默认参数必须始终位于左侧(因为非默认参数不能出现在默认参数之后),您可以计算出需要多少填充,然后将其添加到默认值的前面:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-03
    • 2019-09-11
    • 1970-01-01
    • 2022-11-12
    • 1970-01-01
    • 2012-08-01
    相关资源
    最近更新 更多