Python - 如何处理条件设置正确的结果变量

时间:2012-11-19 05:20:38

标签: python

请考虑以下事项:

    def funcA():
        some process = dynamicVar
        if dynamicVar == 1:
            return dynamicVar
        else:
            print "no dynamicVar"

    def main():
        outcome = funcA()

如果'some process'部分导致1,则var dynamicVar将作为outcome传递回主func。如果dynamicVar不是1,则例程失败,因为没有返回参数。

我可以将结果包装成一个列表:

    def funcA():
        outcomeList = []
        some process = dynamicVar
        if dynamicVar == 1:
            outcomeList.append(dynamicVar)
            return outcomeList
        else:
            print "no dynamicVar"
            return outcomeList

    def main():
        outcome = funcA()
        if outcome != []:
            do something using dynamicVar
        else:
            do something else!

或者可能是字典项目。我能想到的两个解决方案中的每一个涉及主/请求函数中的另一组处理。

这是处理这种可能性的“正确”方法吗?或者,还有更好的方法?

处理这个问题的正确方法是什么?我特别考虑尝试捕获try: / except:错误,因此在该示例中,用法是相反的,所以有类似的内容:

    def funcA():
        some process = dynamicVar
        if dynamicVar == 1:
            return
        else:
            outcome = "no dynamicVar"
            return outcome 

    def main():
        try:
            funcA()
        except:
            outcome = funcA.dynamicVar 

2 个答案:

答案 0 :(得分:3)

在Python中,所有不返回值的函数都将隐式返回None。因此,您只需检查if outcome is not None中的main()

答案 1 :(得分:2)

我相信当你写一个函数时,它的返回值应该是明确的和预期的。你应该回复你说你会回来的东西。话虽如此,您可以使用None作为有意义的返回值来指示操作失败或没有产生结果:

def doSomething():
    """
    doSomething will return a string value 
    If there is no value available, None will be returned
    """
    if check_something():
        return "a string"

    # this is being explicit. If you did not do this,
    # None would still be returned. But it is nice
    # to be verbose so it reads properly with intent.   
    return None

或者您可以确保始终返回相同类型的默认值:

def doSomething():
    """
    doSomething will return a string value 
    If there is no value available, and empty string 
    will be returned
    """
    if check_something():
        return "a string"

    return ""

这处理了一系列复杂的条件测试,最终只是通过:

def doSomething():
    if foo:
        if bar:
            if biz:
                return "value"
    return ""