python - 如何迭代命名关键字参数?

标签 python python-3.x keyword-argument

如何迭代 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/

相关文章:

python - 找出所有小于 200 万的斐波那契奇数之和

python - PRAW/Tweepy 过滤关键字

Python:通过名称和 kwargs 传递参数

python - 用户在使用 Flask 构建的网站上第二次提交表单后,无法成功执行 python 网页抓取脚本

c# - 将 Python 转换为 Unity C# - 数学或如何找到 3D 空间中两条斜线之间的最短距离

python - 如何在Python中拥有数组的数组

python - 如何使用 python 从 csv 文件中读取特定范围的行?

python - 累计金额达到阈值

python - 为什么接受 kwargs 但不使用它们?

python - 将字典发送到不接受 **kwargs 的函数?