如何迭代 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
然后构建一个 dict,然后我会用我所有的关键字参数调用该函数,但这似乎很糟糕。
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
关于python - 如何迭代命名关键字参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63624400/