我正在编写一堆可能具有可变输出的代码,比如算术函数,我可以将输出设置为float或int。基本上我的问题是,如果我要为我需要的每个对象类型创建一个装饰器(可能是七个或八个),我会不断重复:
def Int(fn):
def wrapper():
return int(fn())
return wrapper
我想要的是一个像下面这样的类,它会根据它实例化的名称创建一个装饰器,它将是上面函数的副本,但具有适当的类型修改。
class Decorator(object):
def __init__(self):
...
...
Int = Decorator()
# Then I can use @Int
任何帮助都会非常感激。感谢。
答案 0 :(得分:4)
您不能让Decorator
知道将分配给它的名称。 实例化后,发生,因此在分配名称时已经创建了对象。
然而,您可以制作一个动态创建装饰器的装饰器:
from functools import wraps
def set_return_type(typeobj):
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
return typeobj(func(*args, **kwargs))
return wrapper
return decorator
然后,您可以通过为所需类型提供类型对象参数来使用此装饰器:
@set_return_type(int) # Causes decorated function to return ints
@set_return_type(float) # Causes decorated function to return floats
以下是演示:
>>> from functools import wraps
>>> def set_return_type(typeobj):
... def decorator(func):
... @wraps(func)
... def wrapper(*args, **kwargs):
... return typeobj(func(*args, **kwargs))
... return wrapper
... return decorator
...
>>> @set_return_type(float)
... def test():
... return 1
...
>>> test()
1.0
>>>