使用非字符串关键字传递dict以在kwargs中运行

时间:2013-02-20 14:06:13

标签: python function python-3.x arguments

我使用具有签名f(*args, **kwargs)功能的库。 我需要在kwargs参数中传递python dict,但是dict不包含关键字中的字符串

f(**{1: 2, 3: 4})
Traceback (most recent call last):
  File "<console>", line 1, in <module>
TypeError: f() keywords must be strings

如何在不编辑功能的情况下解决这个问题?

2 个答案:

答案 0 :(得分:7)

根本不允许使用非字符串关键字参数,因此没有针对此问题的通用解决方案。您可以通过将dict的密钥转换为字符串来修复您的具体示例:

>>> kwargs = {1: 2, 3: 4}
>>> f(**{str(k): v for k, v in kwargs.items()})

答案 1 :(得分:1)

我认为你能做的最好就是过滤掉你的dict中的非字符串参数:

kwargs_new = {k:v for k,v in d.items() if isinstance(k,str)}

原因是因为关键字参数必须是字符串。否则,他们会在另一方解开什么?

或者,您可以将非字符串键转换为字符串,但是存在覆盖键的风险:

kwargs_new = {str(k):v for k,v in d.items()}

- 考虑如果你开始时会发生什么:

d = { '1':1, 1:3 }