令我惊讶的是,我注意到,在函数调用中,我可以用字符串that weren't even valid python identifiers解包dict.

令我惊讶的是,参数名必须是标识符,因此允许函数调用解包具有非标识符的**kwargs,并且没有运行时错误,这似乎不太健康(因为这可能会将问题埋得更深,而不会埋在实际发生的地方).

除非有一个实际的use人能够做到这一点,在这种情况下,我的问题变成"那有什么用?".

示例代码

考虑此功能:

def foo(**kwargs):
    first_key, first_val = next(iter(kwargs.items()))
    print(f"{first_key=}, {first_val=}")
    return kwargs

这表明,在函数调用中,您无法解包具有整数键的dict,这是预期的.

>>> t = foo(**{1: 2, 3: 4})
TypeError                                 Traceback (most recent call last)
...
TypeError: foo() keywords must be strings

另一方面,令人意外的是,您可以用字符串键解包dict,即使它们不是有效的python标识符:

>>> t = foo(**{'not an identifier': 1, '12': 12, ',(*&$)': 100})
first_key='not an identifier', first_val=1
>>> t
{'not an identifier': 1, '12': 12, ',(*&$)': 100}

推荐答案

看起来这是一个kwargs个问题,而不是一个解包问题.例如,foo不会遇到同样的问题:

def foo(a, b):
    print(a + b)

foo(**{"a": 3, "b": 2})
# 5

foo(**{"a": 3, "b": 2, "c": 4})
# TypeError: foo() got an unexpected keyword argument 'c'

foo(**{"a": 3, "b": 2, "not valid": 4})
# TypeError: foo() got an unexpected keyword argument 'not valid'

但当使用kwargs时,这种灵活性是有代价的.看起来函数首先try 弹出并映射所有命名参数,然后在名为kwargsdict中传递其余项.由于所有关键字都是字符串(但所有字符串都不是有效关键字),因此第一次判断很容易-keywords must be strings.除此之外,由作者决定如何处理kwargs个项目中的剩余项目.

def bar(a, **kwargs):
    print(locals())
    
bar(a=2)
# {'a': 2, 'kwargs': {}}

bar(**{"a": 3, "b": 2})
# {'a': 3, 'kwargs': {'b': 2}}

bar(**{"a": 3, "b": 2, "c": 4})
# {'a': 3, 'kwargs': {'b': 2, 'c': 4}}

bar(**{1: 3, 3: 4})
# TypeError: keywords must be strings

话虽如此,但肯定有不一致之处,但没有瑕疵.一些相关讨论:

  1. Supporting (or not) invalid identifiers in **kwargs
  2. feature: **kwargs allowing improperly named variables

Python相关问答推荐

为什么常规操作不以其就地对应操作为基础?

如何从pandas DataFrame中获取. groupby()和. agg()之后的子列?

并行编程:同步进程

为什么t sns.barplot图例不显示所有值?'

在电影中向西北方向对齐""

如何获得3D点的平移和旋转,给定的点已经旋转?

简单 torch 模型测试:ModuleNotFoundError:没有名为';Ultralytics.yolo';

如何提高Pandas DataFrame中随机列 Select 和分配的效率?

在pandas中,如何在由两列加上一个值列组成的枢轴期间或之后可靠地设置多级列的索引顺序,

Pandas 删除只有一种类型的值的行,重复或不重复

是否将Pandas 数据帧标题/标题以纯文本格式转换为字符串输出?

正则表达式反向查找

`Convert_time_zone`函数用于根据为极点中的每一行指定的时区检索值

判断字典键、值对是否满足用户定义的搜索条件

设计添加和搜索词的数据 struct :Leetcode211

在Python中比较函数参数和回调函数的正确方法

从一组加速度数据到位置的集成

聚合数据帧的n个连续行的惯用方式

从Pandas Dataframe导出Excel透视表

如何从直接URL和间接URL中提取文件扩展名?