我想我可能会忽略一些简单的事情。我有一个定义了构造函数的类。在其中一个函数中,我调用api,将响应存储在变量中。我想要返回那个变量。有点像,info = MyClass(),data = info.somefunctuon()。在我的情况下,数据始终返回None。
这是我所拥有的片段。
class SomeAPI(object):
def __init__(self, br, cj, username, password, logged_in='', api_id='', data=''):
self.br = br
self.cj = cj
self.logged_in = False
self.username = username
self.password = password
self.api_id = api_id
br.set_cookiejar(self.cj)
br.set_handle_robots(False)
def _login_check(f):
@wraps(f)
def wrapper(self):
if self.log_in():
f(self)
else:
raise MyError('Not Logged In')
return wrapper
def log_in(self):
auth_data = {'cmd': 'auth', 'params': {'username': self.username,
'password': self.password}}
if not self.logged_in:
self.br.open('https://someurl.com/auth', dumps(auth_data))
data = loads(self.br.response().read())
status = data['response']['status']
if status == 'OK':
api_id = data['response']['api_id']
self.logged_in = True
self.api_id = api_id
else:
raise MyError(status)
return self.logged_in
@_login_check
def campaigns_list(self):
campaigns_list_data = {'cmd': 'ab_campaigns'}
raw = self.br.open('https://someurl.com/{}'.format(self.api_id),
dumps(campaigns_list_data))
json_resp = raw.read()
resp = loads(json_resp)
status = resp['response']['status']
if status == 'OK':
data = resp['response']['Ad Campaigns']
return data
当我这样做时:
info = SomeAPI(mechanize.Browser(), cookielib.LWPCookieJar(), 'MyName', '12345')
data = info.campaigns_list()
print data
我总是得到无。我知道我得到了数据,因为当我用print替换return时,我得到了预期的响应。我想也许我需要在构造函数上定义数据,但是我的类的每个函数都需要定义自己的变量。我觉得它会变得混乱。
任何建议请告诉我。谢谢!
答案 0 :(得分:2)
你的装饰器_login_check
调用它包装的函数,但它不返回函数返回的任何内容。
变化:
def _login_check(f):
@wraps(f)
def wrapper(self):
if self.log_in():
f(self)
else:
raise MyError('Not Logged In')
return wrapper
为:
def _login_check(f):
@wraps(f)
def wrapper(self):
if self.log_in():
return f(self)
else:
raise MyError('Not Logged In')
return wrapper