问题描述
如何在Python函数中遍历关键字参数? 例如,说我有以下方法:
class Car():
def start_engine(self,key,*,driver=None,passenger=None,gas=None):
for k,v in <IteraTE_OVER_KEYWORD_ARGUMENT>:
if v is not None:
print(f"KEY: {k} VALUE:{v}")
c = Car()
c.start_engine(key,driver="Bob",passenger="Alice")
应打印:
driver: Bob
passenger: Alice
我不想使用**kwargs
,因为我想命名参数。
我不能只打电话给locals()
,因为我还有其他参数。
我想我可以创建一个包含**kwargs
的辅助函数,然后构建一个字典,然后使用所有关键字参数调用该函数,但这似乎很麻烦。
def to_dict(**kwargs):
d = {k:v for k,v in kwargs.items() if v is not None}
return d
那行得通,但似乎是完成我想做的事情的一种奇怪方法。
是否存在一种可接受的方法来遍历关键字参数,还是因为某些原因而使Python变坏了?
解决方法
在您的情况下,它们都是可选的仅关键字参数(即具有默认值的参数),因此您可以使用:
for k in self.start_engine.__kwdefaults__:
v = locals()[k]
这种简单的方法将无法捕获没有默认值的仅关键字参数。您的问题中显示的Car
没有使用任何内容,但是如果有人需要支持这些"required keyword" arguments,则可能需要检查签名:
>>> import inspect
>>> class Car:
... def start_engine(self,key,*,driver=None,passenger=None,dog,gas=None):
... sig = inspect.signature(self.start_engine)
... for k,v in sig.parameters.items():
... if v.kind is inspect.Parameter.KEYWORD_ONLY:
... print(k,locals()[k])
...
>>> Car().start_engine("key",gas="unleaded",dog="ridgeback")
driver None
passenger None
dog ridgeback
gas unleaded