2014-01-12 141 views
0

我想我可能会忽略一些简单的东西。我有一个定义了构造函数的类。在其中一个函数中,我打电话给api,将响应存储在一个变量中。我想返回该变量。有点像,info = MyClass(),data = info.somefunctuon()。在我的情况下,数据总是返回None。Python类函数不返回变量

这是我所拥有的片段。

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 

我总是无。我知道我得到的数据,因为当我用打印替换返回时,我得到了预期的响应。我想也许我需要在构造函数中定义数据,但是然后我的类的每个函数都需要定义自己的变量。我认为它会变得混乱。

任何建议,请让我知道。谢谢!

+0

也许你错误地访问结果的特定部分 - 添加什么的'print'显示的信息,当你把它取代'回归'。 – BartoszKP

+1

如果状态不是“OK”,该怎么办?你的函数返回的值在所有这些情况下都是无的 – praveen

回答

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 
+0

好抓!那就是诀窍。我知道我忽略了一些东西。除了看着我制作的装饰器之外,我正在尝试所有的东西。再次感谢 – Ptrkcon