首页 > 解决方案 > 装饰器功能未执行

问题描述

我正在尝试按如下方式打印模式:

******
20
******

我使用装饰器功能在主功能之前和之后打印模式。但是我的代码没有打印模式,只有 main 函数正在执行。请建议我如何以更好的格式编写函数。

以下是我的代码:

def banner(str1, len1):
    def decorator(func):
        def wrapper(*args1):
            new_line = '\n'
            str2 = str1 * len1
            return f'{str2}{new_line}{func(*args1)}{new_line}{str2}'
        return wrapper
    return decorator

@banner('*', 6)
def func1(a, b):
    print(a*b)

func1(5,4)

标签: pythonpython-decorators

解决方案


您需要return a * b,而不是打印它:

@banner('*', 6)
def func1(a, b):
    return a * b

输出:

>>> func1(5, 4)
'******\n20\n******'

>>> print(func1(5, 4))
******
20
******

您需要返回的原因是因为您的包装函数是在该 f 字符串的中间调用的,带有func(*args1). 如果函数中最初只有一条print语句,则您的函数默认为return NonePython 中的所有函数默认为隐式,如果 areturn未显式提供。


推荐阅读