【问题标题】:Python check if an argument was passed in by position or by keywordPython 检查参数是按位置还是按关键字传入
【发布时间】:2020-10-24 12:23:01
【问题描述】:

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

在某些情况下,我正在克隆和覆盖函数。被覆盖函数的签名可能会随着时间的推移而增长,所以我想要一些我以后不必更改的东西,我可以用它来提取我关心的几个参数并忽略所有其他参数。

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

foo("bar", "baz")
foo(arg1="bar", arg2="baz")

两者都有效。如果我使用argskwargs 来捕获所有参数,我必须弄清楚它最终在哪个参数中。到目前为止,我正在这样做:

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(arg1, arg2):定义你的函数,两种调用方式都可以工作
  • 看来您实际上并不想在这里使用 argskwargs 但打算期待一个名为 arg1arg2 的参数 - 所以你应该包括它们

标签: python parameter-passing args keyword-argument


【解决方案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",而不是barbaz,为了一个独立的示例,但它不依赖于它们是字符串。)

【讨论】:

    猜你喜欢
    • 2012-11-16
    • 2016-04-28
    • 2023-03-18
    • 2021-03-04
    • 2013-02-06
    • 1970-01-01
    • 1970-01-01
    • 2013-10-24
    • 2016-12-18
    相关资源
    最近更新 更多