Python 为什么不';t装饰函数更简单?

Python 为什么不';t装饰函数更简单?,python,Python,为什么decorator函数需要定义自己的函数,而不仅仅是运行代码…因此,与其这样: def decor(func): def wrap(): print("============") func() print("============") return wrap def print_text(): print("Hello world!") decorated = decor(print_text) decorat

为什么decorator函数需要定义自己的函数,而不仅仅是运行代码…因此,与其这样:

def decor(func):
    def wrap():
        print("============")
        func()
        print("============")
    return wrap

def print_text():
    print("Hello world!")

decorated = decor(print_text)
decorated()
为什么不这样做:

def decor(func):
    print("============")
    func()
    print("============")

def print_text():
    print("Hello world!")

decorated = decor(print_text)
decorated

decorator语法的目的是将函数应用于可调用函数,并生成另一个可调用函数。在你的第二个例子中,你没有真正的装饰师;您只是将一个函数引用传递给调用它的另一个函数

换句话说,与decorator语法一起使用的函数的定义特性是它返回另一个函数。decorator语法没有什么特别之处;它是一种语法糖,它不会做任何常规Python语法无法完成的事情。以下

@foo
def bar(...):
    ...
与更明确的形式完全相同,但更简洁

def bar(...):
    ...

bar = foo(bar)
您的第二个代码块可以在每次评估时“完成任务”。如果你需要做很多次呢?每次都必须计算表达式
decor(some_function)
,即使修饰的函数
some_function
恰好是相同的东西。如果评估的上下文不完全在您的控制范围内,该怎么办

使用第1种方法,基本上可以将修饰后的函数包装为以后可以计算的形式。每次需要时,你都会呼叫同一个thunk。你甚至可以把电话委托给其他人

您的decorator示例是微不足道的。当代码变得更复杂时,Python将函数作为一级对象返回的能力是一个福音。例如,API需要回调:

def frob(some, args, callback=your_function):
现在,您已经编写了回调函数,并且发现可以通过以下方法提高性能。使用decorator模式,您可以执行以下操作

my_function_memoized = memoize(my_function, *even_more_parameters_controlling_the_memoization_behavior)  # returns decorate function
... ...
frob(some, args, callback=my_function_memoized)

也就是说,修饰后的thunk可以用来代替
my\u函数
。这种情况在Python中经常发生,因为Python使传递可调用函数变得非常容易。

另外,考虑一下如何将附加参数传递给修饰函数……您能解释一下您的意思吗?
defwelcome(arg):print(`Hello${arg}!`)
decord=decor(welcome)
您可以运行
welcome('world')
。如何运行
修饰('world')
?你是说如果主函数需要自定义参数,就不要使用修饰符吗?不。我是说Python方式比你的建议更容易编写通用修饰符(可以创建处理任意参数的包装函数)。