0

这类似于方法重载。当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)
4

3 回答 3

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,因此在您的代码中,这种情况由 first 处理if

于 2013-01-12T21:43:01.000 回答
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]])
    
于 2013-01-12T22:00:23.107 回答
0

python 不支持方法重载。我们可以重载方法但只能使用最新定义的方法

def product(a, b):
    return a*b

def product(a,b,c):
    return a*b*c

如果你打电话product(10, 20)会报错

于 2018-07-02T14:46:28.417 回答