python - Python 检查参数是按位置还是按关键字传入
问题描述
检查参数是按位置还是按关键字传递的更简洁的方法是什么?
在某些情况下,我正在克隆和覆盖函数。被覆盖函数的签名可能会随着时间的推移而增长,所以我想要一些我以后不必更改的东西,我可以用它来提取我关心的几个参数并忽略所有其他参数。
例如,函数调用可能如下所示:
foo("bar", "baz")
foo(arg1="bar", arg2="baz")
两者都是有效的。如果我正在使用args
并kwargs
捕获所有参数,我必须弄清楚它最终出现在哪个参数中。到目前为止,我正在这样做:
def foo(*args, **kwargs):
arg1 = kwargs["arg1"] if "arg1" in kwargs else args[0]
arg2 = kwargs["arg2"] if "arg2" in kwargs else args[1]
我觉得必须有一种更清洁的方法来做到这一点。
解决方案
你可以这样做:
def foo(*args, **kwargs):
argnames = ["arg1", "arg2"]
argdict = dict(zip(argnames, args))
argdict.update(kwargs)
print(argdict)
foo("bar", "baz")
foo(arg1="bar", arg2="baz")
两者都给出相同的:
{'arg1': 'bar', 'arg2': 'baz'}
{'arg1': 'bar', 'arg2': 'baz'}
然后,如果您真的需要,您可以这样做arg1 = argdict["arg1"]
,但您也可以只使用字典而不是提取到命名变量中。
(为了一个独立的例子,在这里使用字符串常量"bar"
and"baz"
而不是bar
and ,但它不依赖于它们是字符串。)baz
推荐阅读
- django - 如何让 Django、类型注解和 Flake8 协同工作?
- c# - DotNetCore NPOI AutoSizeColumn 太窄
- python - 对数学数字序列使用递归?
- google-app-engine - 如何为 Google Java Cloud Endpoints 添加 Kotlin 支持
- node.js - 实时侦听器在带有 Pusher 的 PWA 中不起作用
- docker - 没有从我的 kubernetes 模板中获取命名参数
- sql - 在 bigquery 中解析日期表单字符串
- karate - Post 方法在重定向后转换为 GET
- python - 如何在 TensorFlow 中提高 CNN 的预测能力?
- javascript - 带有javascript的表单按钮不起作用但添加“/?” 到我的网址结尾