如何在Python中创建两个装饰器来执行以下操作?
@makebold
@makeitalic
def say():
return "Hello"
Run Code Online (Sandbox Code Playgroud)
...应该返回:
"<b><i>Hello</i></b>"
Run Code Online (Sandbox Code Playgroud)
我不是试图HTML在一个真实的应用程序中这样做 - 只是试图了解装饰器和装饰器链是如何工作的.
在对另一个问题的答案的评论中,有人说他们不确定functools.wraps在做什么.所以,我问这个问题,以便在StackOverflow上有一个记录,供将来参考:究竟functools.wraps做了什么?
这是Python 2.5,它也是GAE,并不重要.
我有以下代码.我正在使用dec_check类作为装饰器在bar中装饰foo()方法.
class dec_check(object):
def __init__(self, f):
self.func = f
def __call__(self):
print 'In dec_check.__init__()'
self.func()
class bar(object):
@dec_check
def foo(self):
print 'In bar.foo()'
b = bar()
b.foo()
Run Code Online (Sandbox Code Playgroud)
执行此操作时,我希望看到:
In dec_check.__init__()
In bar.foo()
Run Code Online (Sandbox Code Playgroud)
但我得到" TypeError: foo() takes exactly 1 argument (0 given)"作为.foo()一种对象方法,以自我为参数.我猜测问题是bar当我执行装饰器代码时,实例并不存在.
那么如何将一个实例传递bar给装饰器类呢?
我一直在尝试创建一个可以在python中与函数和方法一起使用的装饰器.它本身就不那么难,但是当创建一个带参数的装饰器时,它似乎就是这样.
class methods(object):
def __init__(self, *_methods):
self.methods = _methods
def __call__(self, func):
def inner(request, *args, **kwargs):
print request
return func(request, *args, **kwargs)
return inner
def __get__(self, obj, type=None):
if obj is None:
return self
new_func = self.func.__get__(obj, type)
return self.__class__(new_func)
Run Code Online (Sandbox Code Playgroud)
上面的代码正确地包装了函数/方法,但是在方法的情况下,request参数是它正在操作的实例,而不是第一个非自身参数.
有没有办法判断装饰器是否应用于函数而不是方法,并相应地处理?
所以我需要在一个类中有一些路由,但是路由方法需要有selfattr(访问类的属性)。但是,FastAPI 然后假定self是它自己的必需参数并将其作为查询参数放入
这就是我所拥有的:
app = FastAPI()
class Foo:
def __init__(y: int):
self.x = y
@app.get("/somewhere")
def bar(self): return self.x
Run Code Online (Sandbox Code Playgroud)
但是,422除非您转到 ,否则它将返回/somewhere?self=something。问题在于,那self是 str,因此没用。
我需要一些我仍然可以访问的方法,self而无需将其作为必需的参数。