Python 函数的 kwargs 参数的键是否保证为字符串类型?


def func(**kwargs):
for key, value in kwargs.items():
# Is key always going to be a string?
# Could it have spaces?
pass

关于 Python 中的 kwargs 的两个问题。

  1. kwargs 的每个键都保证是 str 类型吗? 如果是这样,我可以避免类型检查。
  2. 如果 #1 为真,是否保证每个键都没有空格?

直接传递的关键字参数必须是有效的 Python 标识符,是的,它将始终被视为字符串。其他任何东西都是SyntaxError.

f(foo=1) # Works
f($=1) # Fails
f(1=1) # Fails

虽然,您也可以通过解包给出关键字参数。在这种情况下,关键字参数必须仍然是字符串,但它们可以采用任何格式。

让我们定义一个虚拟函数来测试这一点。

def f(**kwargs):
print(kwargs)

关键字参数可以包含空格或数字字符串。它甚至可以包含特殊字符。

f(**{"hello world": 'foo'}) # prints {'hello world': 'foo'}
f(**{"1": 'foo'}) # prints {'1': 'foo'}
f(**{"$": 'foo'}) # prints {'$': 'foo'}

关键字参数必须是字符串。其他任何东西都是TypeError.

f(**{1: 'foo'}) # TypeError: f() keywords must be strings
f(**{b'foo': 1}) # TypeError: f() keywords must be strings

kwargs中的keywords应遵循变量名的规则,full_name是有效的变量名(和有效的keyword(,full name不是有效的变量名(也不是有效的keyword(。

来自 PEP 362 -- 函数签名对象:

参数对象具有以下公共属性和方法:
name : str
- 字符串形式的参数名称。必须是有效的 python 标识符名称(POSITIONAL_ONLY参数除外,它可以将其设置为None

并且,从文档中:

2.3. 标识符和关键字:
... 在 ASCII 范围 (U+0001..U+007F( 中,标识符的有效字符与 Python 2.x 中的相同:大写和小写字母AZ,下划线_,除第一个字符外,数字09。 ...

其他人已经涵盖了这方面的实际方面,但我想知道文档是否真的对关键字词典的类型做出了任何保证。

有关调用语义的文档没有明确说明关键字参数将在字典中具有类型str

这就是文档关于传递给用**声明的参数的关键字参数值类型的全部内容:

包含过多关键字参数的字典(使用关键字作为键,使用参数值作为相应的值(,或(新的(空字典

因此,从理论上讲,文档似乎允许您以bytes的形式接收关键字参数,但这在Python 3的任何当前实现中都不会发生。

(对于 Python 2,同样适用,但对于unicode而不是bytes

最新更新