在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
Run Code Online (Sandbox Code Playgroud)
我问这个是因为使用包含破折号的名称格式化更方便(因为这些值对应于名称中带有破折号的命令行参数).但这种行为是否可靠(即它可以在Python版本之间变化)?
我不确定是否正式支持使用非标识符作为关键字参数:实际上,文档中包含:
如果语法**表达式出现在函数调用中,则表达式必须求值为映射,其内容被视为附加关键字参数.
...其中"关键字参数"被定义为具有作为标识符的名称:
keyword_arguments :: = keyword_item(","keyword_item)*
keyword_item :: = identifier"="表达式
其中标识符在它们可以使用的字符限制(-例如是禁止的):
identifier :: =(letter |"_")(字母|数字|"_")*
因此,文件表明,给予映射**函数调用中应该只包含合法的标识符作为键,但CPython的2.7接受更广泛的键(format()和功能与**参数,它不把值变量).这是一个可靠的功能吗?