可选参数,它们的某些组合需要(Optional Parameters, certain combin

2019-10-20 09:03发布

我有一个一般性的问题,以及具体的使用情况。

可选参数是很容易的: def func(a, b, c=None): ...然后在任何地方Ç可能在体内使用只写if c:第一,或沿着这些线路的东西。 但对于何时参数的特定组合是必需的? 一般情况下是要考虑它的确切参数存在或不是任意的情况。 对于函数def func(a, b, c=None, d=None, e=None, f=None): ...这将包括无聊的事情,如:提供c和d而不是E和F,或提供电子仅在或提供C,d,e和f的至少3。 但是我的使用情况下并不需要这样的普遍性。

对于def func(a, b, c=None, d=None): ... ,我要精确地设置一个c和d的。

我想过的解决方案包括:
- 在身,手动检查多少c和d都不是没有的,如果它不完全1,返回一个错误,说正好1需要指定
恩。

def func(a, b, c=None, d=None):
    how_many_provided = len([arg for arg in [c, d] if arg]) # count the non-None optional args
    if not how_many_provided == 1:
        return "Hey, provide exactly 1 of 'c' and 'd'"
    if c:
        # stuff to do if c is provided
    elif d:
        # stuff to do if d is provided

-改变功能是def func(a, b, e, f): ...其中e代表c或d和f指示哪个那些Ë中的一个表示。
恩。

def func(a, b, e, f):
    if f == 'c':
        # stuff to do if c is provided, with e as c
    if f == 'd':
        # stuff to do if d is provided, with e as d

这些工作,但标准是什么/接受/ Python的这样的方式?

Answer 1:

你可以只使用关键字ARGS字典:

def func(a, b, **kwargs):
  valid_args = len(kwargs) == 1 and ('c' in kwargs or 'd' in kwargs)

  if not valid_args:
      return "Hey, provide exactly 1 of 'c' and 'd'"
  if 'c' in kwargs:
      # stuff to do if c is provided
  elif 'd' in kwargs:
      # stuff to do if d is provided


Answer 2:

我想说在您简单的情况下,您的用户最简单的方法就是重构,以独立的功能。 每个函数执行不同的工作描述,然后很常见的比如你的最后一宗个案

def funcC(a, b, c):
        # stuff to do if c is provided, with e as c
    common_func(a,b,c, None)

def funcD(a, b, d):
    # stuff to do if d is provided, with e as d
    common_func(a,b,None, d)

然后,用户知道哪些参数事项,只有合法的可能的组合都可以使用,用户不必猜测或有机会不正确地调用它们。 你作为提供功能可以提供任何需要的调用者没有提供参数。

还有通过google搜索“标志参数”发现的这些较长的解释如Martin Fowler的 堆栈溢出这些往往提布尔参数,但是这实际上同样的事情,不同的代码路径,这取决于有没有其他的效果相关的参数。

另一个成语是寻找“控制耦合”



Answer 3:

这里是另外一个,这将允许指定的参数,并区分c=Nonec没有给出,同时还提供了参数名明确:

undefined = object()

def func(a, b, c=undefined, d=undefined):
    if (c is undefined) ^ (d is undefined):
        raise TypeError("Hey, provide exactly 1 of 'c' and 'd'")

    ...

在Python 3中,仅关键字参数让它更漂亮,确保调用者明确指定cd

def func(a, b, *, c=undefined, d=undefined):
    if (c is undefined) ^ (d is undefined):
        raise TypeError("Hey, provide exactly 1 of 'c' and 'd'")


文章来源: Optional Parameters, certain combination of them required