Python 检查参数是按位置还是按关键字传入的
Python check if an argument was passed in by position or by keyword
检查参数是按位置还是按关键字传入的更简洁的方法是什么?
我在某些情况下克隆和覆盖函数。覆盖函数的签名可能会随着时间的推移而增长,所以我想要一些我以后不必更改的东西,我可以用它来提取我关心的几个参数而忽略所有其他参数。
例如,函数调用可能如下所示:
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"
和 "baz"
,而不是 bar
和 baz
,为了一个独立的例子,但它不依赖于它们是字符串。)
检查参数是按位置还是按关键字传入的更简洁的方法是什么?
我在某些情况下克隆和覆盖函数。覆盖函数的签名可能会随着时间的推移而增长,所以我想要一些我以后不必更改的东西,我可以用它来提取我关心的几个参数而忽略所有其他参数。
例如,函数调用可能如下所示:
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"
和 "baz"
,而不是 bar
和 baz
,为了一个独立的例子,但它不依赖于它们是字符串。)