Python检查参数是按位置还是按关键字传入的

Python检查参数是按位置还是按关键字传入的,python,parameter-passing,args,keyword-argument,Python,Parameter Passing,Args,Keyword Argument,检查参数是按位置还是按关键字传入的更简洁的方法是什么 我在某些情况下克隆和重写函数。被重写函数的签名可能会随着时间的推移而增长,因此我想要一些我以后不必更改的东西,我可以使用这些东西只提取我关心的两个参数,而忽略其余的所有参数 例如,函数调用可能如下所示: foo("bar", "baz") foo(arg1="bar", arg2="baz") 两者都是有效的。如果我使用args和kwargs捕获所有参数,那么我

检查参数是按位置还是按关键字传入的更简洁的方法是什么

我在某些情况下克隆和重写函数。被重写函数的签名可能会随着时间的推移而增长,因此我想要一些我以后不必更改的东西,我可以使用这些东西只提取我关心的两个参数,而忽略其余的所有参数

例如,函数调用可能如下所示:

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
,以获得一个自包含的示例,但这并不依赖于它们是字符串。)

您可以执行以下操作:

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
,这是一个自包含的示例,但并不依赖于它们是字符串。)

如果使用
def foo(arg1,arg2)定义函数:
调用它的两种方法都会起作用。似乎您实际上不想在此处使用
args
kwargs
,而是希望使用名为
arg1
arg2
的参数-因此,如果您使用
def foo(arg1,arg2)定义函数,则应该包含它们:
调用它的两种方法都会起作用。看起来您实际上并不想在此处使用
args
kwargs
,而是希望使用名为
arg1
arg2
的参数,所以您应该包含它们