2014-01-12 2 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 

Я всегда получаю None. Я знаю, что получаю данные, потому что, когда я заменяю return print, я получаю ожидаемый ответ. Я подумал, может быть, мне нужно будет определить данные о конструкторе, но тогда каждой функции моего класса будет нужна его собственная переменная. Я думаю, что это будет беспорядочно.

Любые предложения, пожалуйста, дайте мне знать. Спасибо!

+0

Возможно получить доступ к конкретной части результата неправильно - добавьте информацию о то, что 'print' показывает, когда вы кладете его вместо' возврата '. – BartoszKP

+1

Что делать, если статус не «ОК»? значение, возвращаемое вашей функцией, будет None во всех этих случаях – 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

Смежные вопросы