我想编写一个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具有不同的属性。
我该怎么办?
答案 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检查以防止错误。