在 Python 中,将不是Python 标识符的关键字参数提供给函数是否安全?这是一个例子:
>>> '{x-y}'.format(**{'x-y': 3}) # The keyword argument is *not* a valid Python identifier
'3'
>>> '{x-y}'.format(x-y=3)
File "<ipython-input-12-722afdf7cfa3>", line 1
SyntaxError: keyword can't be an expression
我问这个是因为我更方便地使用包含破折号的名称进行格式化(因为这些值对应于名称中带有破折号的命令行参数)。但是这种行为可靠吗(即它可以在 Python 版本之间有所不同)吗?
我不确定官方是否支持使用非标识符作为关键字参数:事实上,文档中写道:
如果语法 **expression 出现在函数调用中,则 expression 必须计算为映射,其内容被视为附加关键字参数。
…其中“关键字参数”被定义为具有作为标识符的名称:
关键字参数 ::= 关键字项 ("," 关键字项)*
关键字项目 ::= 标识符“=”表达式
其中标识符被限制在他们可以使用的字符中(-
例如被禁止):
标识符 ::= (字母|"_") (字母 | 数字 | "_")*
因此,文档表明**
在函数调用中给出的映射应该只包含有效的标识符作为键,但 CPython 2.7 接受更通用的键(forformat()
和带**
参数的函数,它们不会将值放入变量中)。这是一个可靠的功能吗?