缩短经常使用的代码段以测试Python中的返回值

Jaa*_*nus 1 python optimization

考虑一下这个Python片段:

def someTestFunction():
    if someTest:
        return value1
    elif someOtherTest:
        return value2
    elif yetSomeOtherTest:
        return value3
    return None

def SomeCallingFunction():
    a = someTestFunction()
    if a != None:
        return a

    ... normal execution continues
Run Code Online (Sandbox Code Playgroud)

现在,问题是:SomeCallingFunction开始时的三行段获取测试函数的值,如果它不是None,则在许多其他函数中经常重复.三条线太长了.我想把它简化为一个.我怎么做?

我可以自由地重构这个代码,然而someTestFunction的内容却需要.我想过使用异常,但这些似乎没有帮助减少调用代码长度.

(我已经阅读了一些关于Python装饰器的内容,但是没有使用过它们.这会是不是这个地方?它会如何工作?)

DNS*_*DNS 9

如果你想使用装饰器,它看起来像这样:

def testDecorator(f):
    def _testDecorator():
        a = someTestFunction()
        if a is None:
            return f()
        else: return a
    return _testDecorator

@testDecorator
def SomeCallingFunction():
    ... normal execution
Run Code Online (Sandbox Code Playgroud)

首次导入模块时,它会运行testDecorator,并将原始模块SomeCallingFunction作为参数传递给它.返回一个新函数,并绑定到该SomeCallingFunction名称.现在,无论何时调用SomeCallingFunction,它都会运行其他函数,它会执行检查,并返回a原始结果或者原始结果SomeCallingFunction.