我正在使用partial将myArgs添加到我的函数调用中。但是计算myArgs的值需要从文件中读取它。 我想将部分装饰器转换为类。 我该怎么做?
class withHostAndToken(object):
def __init__(self, func):
self.HOST = ''
self.TOKEN = ''
def __call__(self, func):
if self.HOST == '':
self.HOST = cfg.getHost()
if self.TOKEN == '':
self.TOKEN == cfg.getToken()
return functools.partial( func , self.HOST, self.TOKEN)
我得到的错误是:
返回functools.partial(func,self.HOST,self.TOKEN)TypeError: 第一个参数必须是可调用的
以下是此类的非类版本:
def withHostAndToken(func):
HOST = cfg.getHost()
TOKEN = cfg.getToken()
return functools.partial(func , HOST, TOKEN)
这适用于:
@withHostAndToken
def myFunction(HOST, TOKEN, other_arg):
'''do something'''
myFunction(other_arg='someValue')
答案 0 :(得分:3)
你的装饰师逻辑向后,你在func
得到__init__
(因为你没有定义带参数的装饰者)。您可以在func
中获得__call__
的任何参数,例如:
class withHostAndToken(object):
def __init__(self, func):
self.func = functools.partial(func, HOST=cfg.getHost(), TOKEN=cfg.getToken())
def __call__(self, *args, **kwargs):
return self.func(*args, **kwargs)
虽然您不需要functools.partial
,例如:
class withHostAndToken(object):
def __init__(self, func):
self.func = func
self.HOST = cfg.getHost()
self.TOKEN = cfg.getToken()
def __call__(self, *args, **kwargs):
return self.func(self.HOST, self.TOKEN, *args, **kwargs)
注意:假设有一个全局变量,不确定从哪里获得cfg
。