【发布时间】:2019-09-20 22:32:31
【问题描述】:
我有 2 个现有的装饰器可以在 python 中运行,@property 和 @safe_property。这些装饰器无法更改,它们是我无权访问的代码的一部分。
def safe_property(original_property):
def wrap(self):
try:
return original_property(self)
except AttributeError as e:
pass
return wrap
class MyClass(object):
def __init__(self):
pass
@property
@safe_property
def do_func(self):
print("inside do_func!")
return [2,3,4]
通过调用函数:
a = MyClass()
print(a.do_func)
输出对我有好处!:
inside do_func!
[2, 3, 4]
现在,另一个特性来了,我试图根据 (可选) 附加参数过滤掉 do_func 的一些返回值。这意味着一些用户可以像往常一样继续工作并调用:
print(a.do_func)
而其他人可以使用过滤器调用:
print(a.do_func(True))
为了尝试这个,我创建了另一个名为 my_decorator 的装饰器,例如:
def my_decorator(*args, **kwargs):
print(args)
print(kwargs)
def wrapper(*args):
print(args)
if args[1] == True:
return
# how do I return filter?
else:
return #without the filter?
return wrapper
class MyClass(object):
def __init__(self):
pass
@my_decorator
@property
@safe_property
def do_func(self):
print("inside do_func!")
return [2,3,4]
这个功能的当前输出是:
(<property object at 0x02AF0090>,)
{}
(<__main__.MyClass object at 0x00BCDBB0>, True)
None
我怎样才能只过滤奇数**例如,**的返回列表来自: do_func?
谢谢
【问题讨论】:
-
问题在于如何嵌套装饰器。
@property应该是最顶层的装饰器,如果你的其他装饰器处理函数。property()将函数转换为其他东西(属性;这是一个描述符),因此任何 above 的装饰器都需要处理属性而不是函数。
标签: python decorator python-decorators