相关疑难解决方法(0)

是否安全使用函数接受不是标识符的kwargs关键字参数?

在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()和功能与**参数,它不把值变量).这是一个可靠的功能吗?

python identifier python-2.x keyword-argument python-3.x

6
推荐指数
1
解决办法
1001
查看次数