Как в Python передавать объекты из одного модуля в другой?

Есть 3 модуля: main, authorisate, resolve_domain.
Из main запускаются на выполнение все модули. В authorisate выполняется авторизация вконтакте с помощью библиотеки vk_api, возвращает объекты vk и tools, которые должны использоваться в других модулях. В resolve_domain имя группы преобразуется в id. Пока все было в одном файле - работало.
Вопрос: как передать сессию авторизации (vk) из authorisate в другие модули в которых будут функции и классы?
Сейчас выдает ошибку:
File "C:\Source\vk\resolvedomain.py", line 6, in resolve_domain
    resolve_domain = vk.resolveScreenName(screen_name=domain)
AttributeError: 'tuple' object has no attribute 'resolveScreenName'

модуль main
def main():
    logger.log()
    vk = authorisation.authorisate()
    print(resolvedomain.resolve_domain('group_domain', vk))

if __name__ == '__main__':
    sys.exit(main())


модуль authorisate
def authorisate():
    conf = configparser.RawConfigParser()
    conf.read('config.cfg')
    login = conf.get('account', 'login')
    password = conf.get('account', 'password')
    vk_session = vk_api.VkApi(login, password, captcha_handler=captcha_handler)
    vk_session.auth() 
    vk = vk_session.get_api()
    tools = vk_api.VkTools(vk_session)
    return vk, tools


модуль resolve_domain
def resolve_domain(domain):
    resolve_domain = vk.resolveScreenName(screen_name=domain)
    id_from_domain = 0 - resolve_domain['object_id']
    print('resolve ', id_from_domain)
    return id_from_domain


P.S. все, что нужно было это в модуле main через запятую перечислить: vk, tools = authorisation.authorisate() так, как функция возвращает 2 значения, а в модуле resolve_domain добавить аргумент: def resolve_domain(domain, vk):
  • Вопрос задан
  • 5039 просмотров
Решения вопроса 1
fox_12
@fox_12 Куратор тега Python
Расставляю биты, управляю заряженными частицами
> AttributeError: 'tuple' object has no attribute 'resolveScreenName'
Ну так вызов функции вам два значения возвращает - vk и tools
А вы как к свойству объекта пытаетесь обратиться
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
budda
@budda Автор вопроса
методом тыка, решил вот так (может быть криво):
поскольку функция authorisate возвращает кортеж объектов
при вызове функции передал вот такой параметр *vk
id_from_domain = resolvedomain.resolve_domain('lunev_network', *vk)

в самой функции вместо жестко заданного аргумента получаю кортеж *args, а потом из него извлекаю нужный объект:
def resolve_domain(domain, *args):
    vk = args[0]
    resolve_domain = vk.resolveScreenName(screen_name=domain)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы