草庐IT

Decorator

全部标签

python - 如何在python中装饰一个生成器

所以,我定义了一个简单的生成器:defgen1(x):ifx基本上,我想装饰它以返回所有值,但最后一个值:defdec(gen):defnew_gen(x):g=gen(x)value=g.next()forving:yieldvaluevalue=vreturnnew_gen现在,如果我重新定义gen1@decdefgen1(x):...foriingen1(1):printi#Nothingprinted但如果我使用:some_gen=dec(gen1)foriinsome_gen(1):printi#Prints1to9,asneeded为什么我的装饰器不起作用,我该如何解决?

python - 在装饰器中修改函数

我正在考虑制作装饰器以提高性能。一个装饰器,修改它装饰的函数的源代码,并返回修改后的函数。经过深思熟虑,我想如果我能拿到函数的源代码,我就可以做到这一点。但是是否可以在装饰器中访问函数的源代码?如果我有这样的装饰器:importinspectdefdecorate(f):exec(inspect.getsource(f))returneval(f.__name__)@decoratedeftest():return1我得到一个操作系统错误:OSError:couldnotgetsourcecode这似乎是因为test在被传递到decorate之前没有完全形成。但是,这有效:import

python - celery 任务和自定义装饰器

我正在使用django和celery(django-celery)开发一个项目。我们的团队决定将所有数据访问代码包装在(app-name)/manager.py中(而不是像django那样包装到管理器中),并让代码进入(app-name)/task.py只处理用celery组装和执行任务(所以我们在这一层没有djangoORM依赖)。在我的manager.py中,我有这样的东西:defget_tag(tag_name):ctype=ContentType.objects.get_for_model(Photo)try:tag=Tag.objects.get(name=tag_name)

使用 line_profiler 进行 Python 分析 - 即时删除 @profile 语句的巧妙方法?

我想用优秀的line_profiler,但只是在某些时候。为了让它工作,我添加了@profile在每个函数调用之前,例如@profiledefmyFunc(args):blahreturn并执行kernprof.py-l-vmycode.pyargs但我不想每次都手动添加@profile装饰器,因为大多数时候我想在没有它们的情况下执行代码,如果我尝试将它们包括在内,例如mycode.pyargs是否有一种快乐的媒介,我可以根据某些条件切换/参数动态删除装饰器,而无需手动操作和/或过多地修改每个函数? 最佳答案 而不是删除@profi

Python 类装饰器参数

我正在尝试将可选参数传递给我的python类装饰器。在我目前拥有的代码下方:classCache(object):def__init__(self,function,max_hits=10,timeout=5):self.function=functionself.max_hits=max_hitsself.timeout=timeoutself.cache={}def__call__(self,*args):#Herethecodereturningthecorrectthing.@Cachedefdouble(x):returnx*2@Cache(max_hits=100,time

Python 动态装饰器——为什么有这么多包装?

所以我对Python装饰器还是有点陌生​​——我以前用过它们,但我从未制作过自己的装饰器。我正在阅读thistutorial(那个特定的段落)我似乎不明白为什么我们需要三层功能?为什么我们不能这样做:defdecorator(func,*args,**kwargs):returnfunc(*args,**kwargs)谢谢:) 最佳答案 好吧,如果你在一个函数上调用那个装饰器会发生什么?@decoratordeffoo():pass这段代码会立即调用foo,这是我们不希望的。装饰器被调用并且它们的返回值替换函数。这和说是一样的def

python - 对函数和方法使用相同的装饰器(带参数)

我一直在尝试创建一个可以与python中的函数和方法一起使用的装饰器。这本身并不难,但是当创建一个带有参数的装饰器时,它似乎很难。classmethods(object):def__init__(self,*_methods):self.methods=_methodsdef__call__(self,func):definner(request,*args,**kwargs):printrequestreturnfunc(request,*args,**kwargs)returninnerdef__get__(self,obj,type=None):ifobjisNone:retur

python - 对函数和方法使用相同的装饰器(带参数)

我一直在尝试创建一个可以与python中的函数和方法一起使用的装饰器。这本身并不难,但是当创建一个带有参数的装饰器时,它似乎很难。classmethods(object):def__init__(self,*_methods):self.methods=_methodsdef__call__(self,func):definner(request,*args,**kwargs):printrequestreturnfunc(request,*args,**kwargs)returninnerdef__get__(self,obj,type=None):ifobjisNone:retur

python - 是否有一种 pythonic 方法可以跳过子类方法的装饰?

我有一个类使用来自另一个库的装饰器来装饰一些方法。具体来说,该类对flask-restful资源进行子类化,用httpauth.HTTPBasicAuth().login_required()修饰http方法,并对模型服务进行一些合理的默认设置。我希望在大多数子类上应用装饰器;因此我宁愿删除它也不愿将其添加到子类中。我的想法是有一个执行操作的私有(private)方法和一个装饰的公共(public)方法。可以通过覆盖公共(public)方法调用私有(private)方法而不装饰这个覆盖来避免装饰的影响。下面的模拟示例。我很想知道是否有更好的方法来做到这一点。python中是否有“取消装

python - 是否有一种 pythonic 方法可以跳过子类方法的装饰?

我有一个类使用来自另一个库的装饰器来装饰一些方法。具体来说,该类对flask-restful资源进行子类化,用httpauth.HTTPBasicAuth().login_required()修饰http方法,并对模型服务进行一些合理的默认设置。我希望在大多数子类上应用装饰器;因此我宁愿删除它也不愿将其添加到子类中。我的想法是有一个执行操作的私有(private)方法和一个装饰的公共(public)方法。可以通过覆盖公共(public)方法调用私有(private)方法而不装饰这个覆盖来避免装饰的影响。下面的模拟示例。我很想知道是否有更好的方法来做到这一点。python中是否有“取消装