gpt4 book ai didi

python - 装饰师的工作

转载 作者:行者123 更新时间:2023-11-28 19:57:15 25 4
gpt4 key购买 nike

我有一个关于装饰器工作的问题。我想用一个例子来解释我的问题

我为理解装饰器而实现的代码

import sys
import inspect
def entryExit(f):
def new_f(self,*args, **kwargs):
print "Entering", f.__name__,self.__class__.__name__,inspect.getargspec(f).args[1:]
f(self,*args)
print "Exited", f.__name__,self.__class__.__name__,inspect.getargspec(f).args[1:]
return new_f


class A:
@entryExit
def move(self,g,h):
print "hello"
print g,h

@entryExit
def move1(self,m,n):
print "hello"
print m,n
return m
a=A()
a.move(5,7)
h=a.move1(3,4)
print h

这段代码的输出是

Entering move A ['g', 'h']
hello
5 7
Exited move A ['g', 'h']
Entering move1 A ['m', 'n']
hello
3 4
Exited move1 A ['m', 'n']
None

输出的最后一行显示None。但是使用装饰器改变了方法的实际含义。 move1 方法中的 return 语句没有被执行。我需要的实际输出是

Entering move A ['g', 'h']
hello
5 7
Exited move A ['g', 'h']
Entering move1 A ['m', 'n']
hello
3 4
Exited move1 A ['m', 'n']
3

那么我在创建装饰器时是否犯了任何错误,或者装饰器总是忽略函数中的 return 语句?

最佳答案

要让函数返回一个值,您必须将装饰器的定义更改为:

def new_f(self,*args, **kwargs):
print "Entering", f.__name__,self.__class__.__name__,inspect.getargspec(f).args[1:]
ret = f(self,*args)
print "Exited", f.__name__,self.__class__.__name__,inspect.getargspec(f).args[1:]
return ret
return new_f

并不是装饰器“总是忽略”返回语句,而是你必须自己处理返回——就像你必须使用 *args**kwargs 一样 来处理参数。

关于python - 装饰师的工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15413188/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com