草庐IT

python - 设置函数属性的装饰器

我希望仅当登录用户具有所需的权限级别时才能执行不同的功能。为了让我的生活更简单,我想使用装饰器。下面我尝试在“装饰”函数上设置属性permission-如下所示。defpermission(permission_required):defwrapper(func):definner(*args,**kwargs):setattr(func,'permission_required',permission_required)returnfunc(*args,**kwargs)returninnerreturnwrapper@permission('user')defdo_x(arg1,a

保留签名和用户定义属性的 Python 装饰器

我有一个简单的装饰器my_decorator,它装饰了my_func。defmy_decorator(func):defwrapper(*args,**kwargs):returnfunc(*args,**kwargs)wrapper._decorator_name_='my_decorator'returnwrapper@my_decoratordefmy_func(x):print('hello%s'%x)my_func._decorator_name_'my_decorator'到这里一切正常,但我看不到函数的实际签名。my_func?Signature:my_func(*arg

python - 我可以使用装饰器来改变 Python 中函数的局部作用域吗?

有没有什么方法可以编写装饰器,使下面的代码可以工作?assert'z'notinglobals()@my_decoratordeffunc(x,y):printz编辑:从anwser移动回答hop的“为什么?”:语法糖/DRY。这与缓存无关,而是根据x和y的值计算z(以及z1、z2、z3......)。我有很多做相关事情的函数,我不想写z1,z2,z3=calculate_from(x,y)在每个函数的开头-我会在某处弄错。如果这是c我会用cpp来做(如果这是lisp,我会用宏来做......),但我想看看装饰器是否可以做同样的事情。如果有帮助,我几乎肯定会将装饰器称为“precalc

python - 你将如何在 python 中编写 @debuggable 装饰器?

在调试时,我喜欢打印出一个函数的所有输入和输出(我知道我需要一个更好的IDE,但幽默一下,这可以用于错误报告)。所以,理想情况下,我希望拥有:@debuggabledefmyfunc(argA,argB,argC):returnargB+1并使用一个全局变量来打开或关闭调试。不,我猜你也不喜欢全局变量。我能想到的最好的是:DEBUG=Truedefdebuggable(func):ifDEBUG:defdecorated(*args):print"Entering",func.func_nameprint"args",argsret=func(*args)printretreturnr

Python装饰器和类继承

我正在尝试使用装饰器来管理用户在网络应用程序(在GoogleAppEngine上运行)中访问或不访问资源的方式。请注意,我不允许用户使用他们的Google帐户登录,因此无法在app.yaml中设置对特定路由的特定访问权限。我使用了以下资源:-BruceEckel'sguidetodecorators-SO:get-class-in-python-decorator2-SO:python-decorators-and-inheritance-SO:get-class-in-python-decorator不过我还是有点迷糊...这是我的代码!在下面的示例中,current_user是属于

python - 为什么装饰类会破坏描述符协议(protocol),从而阻止 staticmethod 对象按预期运行?

我需要一点帮助来理解Python中描述符协议(protocol)的微妙之处,因为它与staticmethod的行为特别相关。对象。我将从一个简单的例子开始,然后迭代地扩展它,检查它在每一步的行为:classStub:@staticmethoddefdo_things():"""CallthislikeStub.do_things(),withnoargumentsorinstance."""print"Doingthings!"此时,它的行为符合预期,但这里发生的事情有点微妙:当您调用Stub.do_things()时,您没有直接调用do_things。相反,Stub.do_thing

python - 回溯显示直到装饰器

这个漂亮的小Python装饰器可以配置禁用装饰函数:enabled=get_bool_from_config()defrun_if_enabled(fn):defwrapped(*args,**kwargs):try:returnfn(*args,**kwargs)ifenabledelseNoneexceptException:log.exception('')returnNonereturnwrapped唉,如果在fn()中引发异常,回溯只会显示到包装器:Traceback(mostrecentcalllast):File"C:\my_proj\run.py",line46,inw

python - 我如何编写装饰器来将某些内容包装在带参数的上下文管理器中?

我看过Howtouseacontextmanagerinsideadecoratorandhowtopassanobjectcreatedindecoratortodecoratedfunction以及pythondecoratorswithparameters,我正在尝试将两者结合起来..但我正在努力解决这个问题。如果可能的话,我更愿意使用func工具@wrap装饰器来执行此操作,因为我知道这是否会保留文档字符串。我想做的是:defpyro_opener(func,service,database,port,secret_key):defwrapper(params):withPyr

python可重置实例方法内存装饰器

我正在尝试为一个将记住结果的类的实例方法构建一个装饰器。(这已经做过一百万次了)但是,我想要能够在任何时候重置内存缓存的选项(比如,如果实例状态中的某些内容发生变化,这可能会改变没有任何方法的结果与其参数有关)。因此,我尝试将装饰器构建为类而不是函数,这样我就可以作为类成员访问缓存。这让我走上了学习描述符的道路,特别是__get__方法,这正是我真正陷入困境的地方。我的代码如下所示:importtimeclassmemoized(object):def__init__(self,func):self.func=funcself.cache={}def__call__(self,*arg

python - 有没有一种 pythonic 方法来支持 Python 中的 memoize 装饰器的关键字参数?

所以我最近问了一个关于记忆化的问题并得到了一些很好的答案,现在我想把它提升到一个新的水平。经过相当多的谷歌搜索后,我找不到能够缓存采用关键字参数的函数的memoize装饰器的引用实现。事实上,他们中的大多数人只是简单地使用了*args。作为缓存查找的键,这意味着如果你想记住一个接受列表或字典作为参数的函数,它也会中断。在我的例子中,函数的第一个参数本身就是一个唯一标识符,适合用作缓存查找的字典键,但是我希望能够使用关键字参数并仍然访问相同的缓存。我的意思是,my_func('unique_id',10)和my_func(foo=10,func_id='unique_id')应该都返回相