Python类函数不返回变量

时间:2014-01-12 19:11:26

标签: python mechanize

我想我可能会忽略一些简单的事情。我有一个定义了构造函数的类。在其中一个函数中,我调用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时,我得到了预期的响应。我想也许我需要在构造函数上定义数据,但是我的类的每个函数都需要定义自己的变量。我觉得它会变得混乱。

任何建议请告诉我。谢谢!

1 个答案:

答案 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