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

eng*_*uan 7 python keyword-argument python-3.x

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

关于 Python 中 kwargs 的两个问题。

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

Oli*_*çon 10

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

f(foo=1) # Works
f($=1) # Fails
f(1=1) # Fails
Run Code Online (Sandbox Code Playgroud)

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

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

def f(**kwargs):
    print(kwargs)
Run Code Online (Sandbox Code Playgroud)

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

f(**{"hello world": 'foo'}) # prints {'hello world': 'foo'}
f(**{"1": 'foo'}) # prints {'1': 'foo'}
f(**{"$": 'foo'}) # prints {'$': 'foo'}
Run Code Online (Sandbox Code Playgroud)

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

f(**{1: 'foo'}) # TypeError: f() keywords must be strings
f(**{b'foo': 1}) # TypeError: f() keywords must be strings
Run Code Online (Sandbox Code Playgroud)