接受一个参数x或另一个参数的函数

时间:2019-06-15 20:14:27

标签: python function parameters parameter-passing xor

我想编写一个python函数,该函数必须采用parameter1或parameter2,但不能同时取而不能为0。

即我想拥有类似

的功能
def fun(param1 = None, param2 = None):
  if all(p is None for p in {param1, param2}):
    raise ValueError('Expected either param1 xor param2')

  if both(param1 and param2):
    raise ValueError('Expected either param1 xor param2')

param1和param2具有不同的属性。

我该怎么办?

2 个答案:

答案 0 :(得分:0)

我对这个问题的看法:

def fun(*args):
    if len(set(i for i, arg in enumerate(args) if arg is not None)) != 1:
        # raise ValueError
        print('Error')
        return
    param1, param2 = args
    print(param1, param2)

fun(1, 1)
fun(1, None)
fun(None, 2)
fun(None, None)

打印:

Error
1 None
None 2
Error

答案 1 :(得分:0)

您似乎一次问了两个问题。

  • 具有多个不同的输入
  • 获得独家或

通过使用通配符参数并在其后添加可能的关键字参数来获得第一部分

def fun(*args, arg1=None, arg2=None): 
    print(arg1, arg2)

现在,我可以使用所需的两个关键字参数中的任何一个调用函数,请注意,如果要向其中添加 any 值,则必须定义关键字参数arg1和arg2。

例如:

fun()                  # None None
fun(arg1=1)            # 1 None
fun(arg2=2)            # None 2
fun(arg1=3, arg2=4)    # 3, 4

# Calls without keyword are stored inside args
fun(1)                 # None None

对于第二部分,我们可以将xor语句解压缩为原始格式“(a和b)或(not a和b)”

然后,我们将得到以下代码并进行测试。

def fun(*args, arg1=None, arg2=None):
    print(arg1, arg2)
    if (arg1 and not arg2) or (not arg1 and arg2):
        print(arg1, arg2)
        return
    return "Error"

fun()                  # None None
fun(1)                 # None None
fun(arg1=1)            # 1 None
fun(arg2=2)            # None 2
fun(arg1=3, arg2=4)    # 3 4

我在此假设arg1和arg2包含一些未转换为布尔False的值。在这种情况下,您需要添加is not None检查以防止错误。