Python 将带有非字符串关键字的dict传递给kwargs中的函数

Python 将带有非字符串关键字的dict传递给kwargs中的函数,python,function,python-3.x,arguments,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 f(**{1:2,3:4}) 回溯(最近一次呼叫最后一次

我使用的库具有签名为
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
f(**{1:2,3:4})
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
TypeError:f()关键字必须是字符串

如何在不编辑函数的情况下解决此问题?

不允许使用非字符串关键字参数,因此没有解决此问题的通用方法。通过将
dict
的键转换为字符串,可以修复您的特定示例:

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

我认为最好的办法是过滤掉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 }

我认为这真的是最好的了。关键字参数必须是字符串,因此
TypeError
@Will--我认为最好的方法实际上取决于您传递的dict。考虑字典<代码> d={‘1’:1,1:3} <代码>。我想真正的最佳解决方案是重写函数,只接受字符串关键字,或者有一个可选的DICT参数来传递字典。这是Python 3,所以没有<代码>基字符串< /代码>。@拉斯曼-足够公平。我没有仔细看标签。