草庐IT

使用属性装饰器的 Python 只读列表

精简版我可以使用Python的属性系统创建一个只读列表吗?长版我创建了一个Python类,其中有一个列表作为成员。在内部,我希望它在每次修改列表时都做一些事情。如果这是C++,我会创建getter和setter,它们允许我在调用setter时进行簿记,并且我会让getter返回一个const引用,这样编译器就会如果我试图通过getter修改列表,就会对我大喊大叫。在Python中,我们有属性系统,因此不再需要(谢天谢地)为每个数据成员编写普通的getter和setter。但是,请考虑以下脚本:defmain():foo=Foo()print('foo.myList:',foo.myLi

python - 从函数装饰器访问函数参数

如果我有一个看起来像这样的函数:@app.route('/categories/id//edit')@login_requireddefedit_category(id):#somecode...login_required装饰器看起来像这样deflogin_required(f):@wraps(f)defwrapper(*args,**kwargs):printid#giventoedit_categorybyapp.routedecoratorreturnf(*args,**kwargs)returnwrapper如何从login_required装饰器访问app.route装饰器

python - 自动装饰类中的每个实例方法

我想对给定类中的每个方法应用相同的装饰器,除了那些以__开头和结尾的方法。在我看来,使用类装饰器应该是可行的。有什么需要注意的陷阱吗?理想情况下,我还希望能够:通过使用特殊装饰器标记某些方法来禁用此机制也为子类启用此机制即使对于在运行时添加到此类的方法也启用此机制[注意:我使用的是Python3.2,所以如果这依赖于最近添加的功能,我没问题。]这是我的尝试:_methods_to_skip={}defapply(decorator):defapply_decorator(cls):formethod_name,methodinget_all_instance_methods(cls):

python - 如何将多个装饰器打包成一个?

我在每个函数上都有几个装饰器,有没有办法将它们打包成一个?@fun1@fun2@fun3defdo_stuf():pass更改为:@all_funs#runsfun1fun2andfun3,howshouldall_funslooklike?defdo_stuf():pass 最佳答案 装饰器原则上只是语法糖:defdo_stuf():passdo_stuf=fun1(do_stuf)所以在你的all_fun中,你需要做的就是将函数包装在同一种装饰器链中:defall_funs(funky):returnfun1(fun2(fun3

python - 如何对装饰函数进行单元测试?

我最近尝试在单元测试最佳实践方面对自己进行大量培训。其中大部分都非常有道理,但有一点经常被忽视和/或解释不当:一个单元测试修饰函数应该如何?假设我有这段代码:defstringify(func):@wraps(func)defwrapper(*args):returnstr(func(*args))returnwrapperclassA(object):@stringifydefadd_numbers(self,a,b):"""Returnsthesumof`a`and`b`asastring."""returna+b我显然可以编写以下测试:deftest_stringify():@s

python - 在 python 中对参数进行操作的嵌套函数装饰器

我正在编写一个函数装饰器,它将对函数的第一个参数应用转换。如果我只装饰我的函数一次,它工作正常,但如果我装饰它们两次,我会得到一个错误。下面是一些演示问题的代码,它是我正在处理的代码的简化版本。我已经排除了进行转换的代码,以免分散对问题的注意力frominspectimportgetargspecfromfunctoolsimportwrapsdefdec(id):def_dec(fn):@wraps(fn)def__dec(*args,**kwargs):iflen(args):returnfn(args[0],*args[1:],**kwargs)else:first_arg=ge

python - 如何跳过或忽略 python 装饰器

有一个由装饰器包装的函数,它将函数的输出作为HTML返回。我想在没有装饰器的HTML包装的情况下调用该函数。这可能吗?例子:classa:@HTMLwrapperdefreturnStuff(input):returnawesome_dictdefcallStuff():#hereIwanttocallreturnStuffwithoutthe@HTMLwrapper,#ijustwanttheawesomedict. 最佳答案 classa:@HTMLwrapperdefreturn_stuff_as_html(self,inpu

Python装饰器与传递函数

defmakebold(fn):defwrapped():return""+fn()+""returnwrappeddefmakeitalic(fn):defwrapped():return""+fn()+""returnwrapped@makeitalic@makebolddefhello():return"helloworld"print(hello())##returns"helloworld"在这段代码中,为什么不直接定义函数makeitalic()和makebold()并传入函数hello呢?我是不是遗漏了什么,或者装饰器真的更适合处理更复杂的事情吗?

python - 数据类和属性装饰器

我一直在阅读Python3.7的数据类作为命名元组的替代方法(当必须在结构中对数据进行分组时,我通常会使用它)。我想知道数据类是否与属性装饰器兼容,以便为数据类的数据元素定义getter和setter函数。如果是这样,这在某处有描述吗?或者有可用的例子吗? 最佳答案 它确实有效:fromdataclassesimportdataclass@dataclassclassTest:_name:str="schbell"@propertydefname(self)->str:returnself._name@name.setterdefn

PHP 相当于 python 装饰器?

我希望能够用另一个函数包装一个PHP函数,但保留其原始名称/参数列表不变。例如:functionA(){print"insideA()\n";}functionWrap_A(){print"CallingA()\n";A();print"FinishedcallingA()\n";}//输出:CallingA()insideA()FinishedcallingA() 最佳答案 这是我在php中模仿python装饰器的方法。functioncall_decorator($decorator,$function,$args,$kwarg