【问题标题】:How to pass two or three parameters to a function?如何将两个或三个参数传递给函数?
【发布时间】:2017-11-08 22:38:41
【问题描述】:

这可能与传统的 *args **kwargs 范例有点不同:

我有一个以三个独立参数作为输入的数学函数,但是,它也可以通过指定三个中的任意两个来解决(非紧凑)。

目前,我有严格基于 a 和 b 的非紧凑解决方案,其中 c 作为可选约束:

def func(a,b,c=None):
  if c is not None:
    # do something with a, b, and c
  else:
    # do something with only a, b
  return result

但是,我希望能够指定 a、b 或 c 中的任意两个,并且仍然保留指定所有三个的选项。最 Pythonic 的方式是什么?

【问题讨论】:

  • 为了区别,无论如何你都需要它们是 kwargs,不是吗?那么**kwargs 方法有什么问题呢?
  • 给他们None的所有默认值,然后将它们作为关键字参数传递。
  • 就您的实际功能块而言,您可能想做一个try: [do something with a, b, and c,然后在except 块中查看抛出了什么异常并决定如何从那里继续。跨度>

标签: python python-3.x optional-parameters


【解决方案1】:

你可以只给它们None的所有默认值,然后将参数作为关键字参数传递:

def foo(a=None, b=None, c=None):
    print(a, b, c)

foo(a=123, b=456)
foo(a=123, c=789)
foo(b=456, c=789)

这个例子产生:

123 456 None
123 None 789
None 456 789

【讨论】:

    【解决方案2】:

    替代方法:

    def func(**kwargs):
        p_keys = kwargs.keys()
        if 'a' in p_keys and 'b' in p_keys:
            # non-compact solution
            if 'c' in p_keys:
                # apply optional constraint
        elif set(p_keys).issubset({'a', 'b', 'c'}):
            # apply solution for 'any two'
        else:
            #complain loudly
            pass
        return
    

    【讨论】:

      猜你喜欢
      • 2018-11-03
      • 2014-03-21
      • 1970-01-01
      • 2021-08-08
      • 1970-01-01
      • 2019-10-27
      • 1970-01-01
      • 2021-10-19
      • 1970-01-01
      相关资源
      最近更新 更多