如何遍历命名关键字参数?

问题描述

如何在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