草庐IT

decorator

全部标签

python - 如何使用装饰器更改函数的返回值?

我想创建一个装饰器来像那样更改函数的返回值,如何像下面那样做?:defdec(func):defwrapper():#somecode...#changereturnvalueappend'c':3returnwrapper@decdeffoo():return{'a':1,'b':2}result=foo()printresult{'a':1,'b':2,'c':3} 最佳答案 嗯....你调用装饰函数并改变返回值:defdec(func):defwrapper(*args,**kwargs):result=func(*args,

python - 修复处理@property setter装饰器的pyflakes

Pyflakes不能很好地处理以下代码:@propertydefnodes(self):returnself._nodes@nodes.setterdefnodes(self,nodes):"""setthenodesonthisobject."""assertnodes!=[]#withoutnodesnoroute..self.node_names=[node.namefornodeinnodes]self._nodes=nodes使用vim和使用pyflakes的syntastic我得到以下错误:W806redefinitionoffunction'nodes'fromline5

python - 装饰器类和装饰器函数的区别

我想这就是它们的称呼方式,但为了以防万一,我会举一些例子。装饰类:classdecorator(object):def__init__(self,func):self.func=funcdef__call__(self,*args,**kwargs):print'something'self.func(*args,**kwargs)装饰器函数:defdecorator(func):defwrapper(*args,**kwargs):print'something'returnfunc(*args,**kwargs)returnwrapper使用其中一种只是个人喜好问题吗?有什么实际区

python - 具有多个装饰器的 celery 任务不会自动注册任务名称

我有一个看起来像这样的任务frommybasetask_moduleimportMyBaseTask@task(base=MyBaseTask)@my_custom_decoratordefmy_task(*args,**kwargs):pass我的基本任务是这样的fromceleryimporttask,TaskclassMyBaseTask(Task):abstract=Truedefault_retry_delay=10max_retries=3acks_late=True我遇到的问题是celeryworker正在用名称注册任务'mybasetask_module.__inner

python - Django:调整@login_required 装饰器

我想为我的网站开始私有(private)测试版。我有一个初始页面,用户可以在其中输入代码以访问网站的其余部分。目前,所有其他网站页面(启动页面除外)都包含一系列通过要求用户登录(通过@login_required装饰器)设置的重定向。我希望登录用户和输入BetaTester代码的人都能够访问站点的其余部分。这意味着我不能只对所有View使用装饰器。我应该改变@login_required装饰器本身吗?我更想做以下事情(如果用户在启动页面上输入正确的代码,我添加了一个session变量)。defview_name(request):user=request.userifnotuser.i

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