有没有办法在python函数中的每个return语句之前执行一个语句?

Dmi*_*try 7 python python-2.7

例如,我有这段代码:

def example():
    a = 'goodbye'
    if True:
        print a
        return 1
    else:
        print a
        return 0
Run Code Online (Sandbox Code Playgroud)

我想知道是否有任何可能的解决方案来编写一次"print a"并在每个"return"语句自动执行之前执行它.因此,如果我添加更多返回语句,我将不需要添加任何内容,但"print a"将执行.结果看起来像是:

def example():
    a = "goodbye"
    """ some code to implement print a """
    if True:
        return 1
    else:
        return 0
Run Code Online (Sandbox Code Playgroud)

每次有return语句时它仍然会打印出来.

我试图谷歌,但不知道单词查询,因为所有结果都是关于返回多个值.

更新:感谢你们所有人,我的问题得到了回答.
虽然包装功能是正确的答案,但我选择了GingerPlusPlus的答案,他建议try...finally简单使用.

Did*_*set 8

您可以使用上下文.使用要打印的值对其进行初始化.然后在上下文退出时打印,即返回时打印.

class PrinterOnContextExit():
    def __init__( self, a ): self.a = a
    def __enter__( self ): pass
    def __exit__( self, exc_type, exc_value, traceback ): print( self.a )

def example():
    a = 'goodbye'
    with PrinterOnContextExit( a ):
        if True:
            return 1
        else:
            return 0
Run Code Online (Sandbox Code Playgroud)

请注意,您无法以这种方式打印返回的值.如果您想打印返回的值,那么您应该使用装饰器.

class PrintOnReturn():
    def __init__( self, a ): self.a = a
    def __call__( self, func ): return lambda *args, **kwargs: self.callFunc( func, *args, **kwargs )
    def callFunc( self, func, *args, **kwargs ): r = func( *args, **kwargs ); print( self.a, r ); return r

@PrintOnReturn( "hello" )
def example():
    if True:
        return 1
    else:
        return 0
Run Code Online (Sandbox Code Playgroud)

这将打印您传递给装饰器的任何字符串,然后是装饰函数返回的值.在这里hello 1.


Gin*_*lus 6

try .. finally:

def example():
    try:
       if True:
           return 1
       else:
           return 0
    finally:
        print 'goodbye'

>>> example()
goodbye
1
Run Code Online (Sandbox Code Playgroud)

一个最终条款在离开之前一直执行try的语句,是否已经发生也不例外.文件