这类似于方法重载。当print Hello(1, 2, 3)
执行时,它会返回"a and b"
,而我希望它返回"a and b and c"
。我知道我可以说if (a and b and c is None)
然后它会起作用。但是如果我有20个参数并且我必须处理每个案例,那么只有多个if
语句我认为不应该是必要的。我有更好的方法来做这样的问题吗?
def Hello(a=None, b=None, c=None):
if(a and b):
return "a and b"
if(a and c):
return "a and c"
if(a and b and c):
return "a and b and c"
print Hello(1, 2, 3)
答案 0 :(得分:4)
您需要重新排序if
语句:
def Hello(a=None, b=None, c=None):
if a and b and c:
return "a and b and c"
if a and b:
return "a and b"
if a and c:
return "a and c"
当a and b and c
评估为true时,a and b
也会计算为true,因此在您的代码中,此案例由第一个if
处理。
答案 1 :(得分:3)
你需要重新考虑你的程序逻辑。通常,API 不具有所有可选参数,您需要从所有输入构建大型决策树。
换句话说,在实际程序中,您通常不会遇到一种功能,其中每种不同的输入组合的行为完全不同。总是,即使对于大量可选参数,合法组合也要小得多。
对于您的玩具示例,您可以提出其他方法来创建不涉及决策树的返回值:
地图回复:
responsemap = {
(True, True, False): "a and b",
(True, False, True): "a and c",
(True, True, True): "a and b and c"
}
def Hello(a=None, b=None, c=None):
return responsemap.get((bool(a), bool(b), bool(c)), None)
根据输入构建字符串:
def Hello(a=None, b=None, c=None):
return ' and '.join([n for n in ('a', 'b', 'c') if locals()[n]])
答案 2 :(得分:1)
python不支持方法重载。我们可能会重载这些方法,但只能使用最新定义的方法
def product(a, b):
return a*b
def product(a,b,c):
return a*b*c
如果您致电product(10, 20)
会出错