def func(**kwargs):
for key, value in kwargs.items():
# Is key always going to be a string?
# Could it have spaces?
pass
关于Python中kwargs的两个问题。
- kwargs的每个键是否保证为str类型?如果是,则我可以避免类型检查。
- 如果#1成立,那么每个键是否保证不含空格?
def func(**kwargs):
for key, value in kwargs.items():
# Is key always going to be a string?
# Could it have spaces?
pass
关于Python中kwargs的两个问题。
直接傳遞的關鍵字參數必須是有效的 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
__slots__
?对象的 __slots__
看起来只能使用字符串。 - wwii__slots__
无关,除了它们代表相似的概念并且被赋予了相同的名称。 __slots__
机制涉及类实例的属性,而不是函数调用。 - Blckknghtkwargs
中的 keywords
应该遵循变量名的规则,full_name
是一个有效的变量名(也是一个有效的keyword
),而 full name
不是一个有效的变量名(也不是一个有效的keyword
)。并且,来自 Docs:Parameter 对象具有以下公共属性和方法:
name : str
- 参数的名称作为字符串。必须是一个有效的 Python 标识符名称(除了POSITIONAL_ONLY
参数,它可以被设置为None
)。
2.3. Identifiers and keywords:
... 在 ASCII 范围内(U+0001..U+007F),标识符的有效字符与 Python 2.x 相同:大写字母A
到Z
、下划线_
和除了第一个字符以外的数字0
到9
。 ...
kwargs
的名称。 - juanpa.arrivillagaf(..., key=value)
,那么 key
必须是一个有效的标识符名称。但是,如果像您所做的那样使用字典解包来调用函数,则可以使用任意字符串作为键。 - GZ0str
类型。**
声明参数的关键字参数值类型:bytes
,但这不会发生在任何现有的Python 3实现中。(对于Python 2,情况相同,但是使用unicode
而不是bytes
。)
abstract.h
_PyVectorcall_Function
- wwiiif (!_PyDict_HasOnlyStringKeys(kwargs)) {...
- 在getargs.c中 - wwii