Size: a a a

2020 November 28

DS

David Shiko in SPb Python
Помогите пожалуйста настроить импорты

У менять есть main файл
import conversations
if __name__ == '__main__':
   bot = tg.Bot(token=config.tg_bot_token, request=request)  # , base_url=PROXY_URL)
   updater = Updater(bot=bot, use_context=True)
   dispatcher = updater.dispatcher
   dispatcher.add_handler(conversations.conversation_registration_handler)

и conversations файл

from main import bot
def start_reg():
   bot.get_me()
if __name__ == '__main__':
   conversation_registration_handler = ConversationHandler(
   entry_points=[MessageHandler(Filters.regex(config.reg_r), start_reg)],

       states={
           0: [MessageHandler(Filters.text, user_name)],
           1: [MessageHandler(Filters.text, user_goal)], })

Собственно в таком виде ничего не работает. Особенно смущает, что `name == main`, а не  __main__ у главного файла
источник

DS

David Shiko in SPb Python
Я создал в директории пустой файлик __init__.py, но не помогло
источник

VK

Vitaly Kalinin in SPb Python
David Shiko
Помогите пожалуйста настроить импорты

У менять есть main файл
import conversations
if __name__ == '__main__':
   bot = tg.Bot(token=config.tg_bot_token, request=request)  # , base_url=PROXY_URL)
   updater = Updater(bot=bot, use_context=True)
   dispatcher = updater.dispatcher
   dispatcher.add_handler(conversations.conversation_registration_handler)

и conversations файл

from main import bot
def start_reg():
   bot.get_me()
if __name__ == '__main__':
   conversation_registration_handler = ConversationHandler(
   entry_points=[MessageHandler(Filters.regex(config.reg_r), start_reg)],

       states={
           0: [MessageHandler(Filters.text, user_name)],
           1: [MessageHandler(Filters.text, user_goal)], })

Собственно в таком виде ничего не работает. Особенно смущает, что `name == main`, а не  __main__ у главного файла
источник

VK

Vitaly Kalinin in SPb Python
начать, наверное, стоит с этого
источник

DS

David Shiko in SPb Python
Vitaly Kalinin
начать, наверное, стоит с этого
Я это знаю, как это решает вопрос?
источник

VK

Vitaly Kalinin in SPb Python
David Shiko
Я это знаю, как это решает вопрос?
раз вы это знаете, тогда почему вы пытаетесь в файл conversations импортировать bot из файла main?
источник

VK

Vitaly Kalinin in SPb Python
ну и в продолжение:
https://stackabuse.com/python-circular-imports/
источник

DS

David Shiko in SPb Python
Vitaly Kalinin
раз вы это знаете, тогда почему вы пытаетесь в файл conversations импортировать bot из файла main?
Я знаю, но не понимаю как это влияет.
Как мне использовать bot внутри conversations ?
и почему при запуске main name ~=  'main' ?
источник

ВЩ

Взщз Щщщхш in SPb Python
__name__ равно "__main__" только в файле, который запускается напрямую. Можно попробовать вывести значение __name__ в каждом модуле и посмотреть.
источник

ВЩ

Взщз Щщщхш in SPb Python
В if __name__ == "__main__": размещают те действия, который должны выполниться, если запустить файл напрямую, но не при импорте.
источник

DS

David Shiko in SPb Python
Так-с, я понял проблему. from main import bot так же запускает весь скрипт main.
т.е. сперва исполняется main, далее conversations, далее снова main.
Как решить эту проблему, т.е. сделать правильную архитектуру импортов?
источник

DS

David Shiko in SPb Python
Я мог бы создавать бота в файле config 1 раз (хотя тогда логичнее уже назвать этот файлик variables)
источник

ВЩ

Взщз Щщщхш in SPb Python
Побочные эффекты (например, запуск бота) только в главном файле. Главный файл импортирует объекты из других файлов.
источник

ВЩ

Взщз Щщщхш in SPb Python
Каждый импортируемый модуль запускается всего один раз и сохраняется в памяти:
>>> import math as math_a
>>> import math as math_b
>>> math_a is math_b
True
>>>
источник

DS

David Shiko in SPb Python
Взщз Щщщхш
Каждый импортируемый модуль запускается всего один раз и сохраняется в памяти:
>>> import math as math_a
>>> import math as math_b
>>> math_a is math_b
True
>>>
А какая общепринятая практика?
источник

ВЩ

Взщз Щщщхш in SPb Python
Общепринятая практика для чего?
источник

DS

David Shiko in SPb Python
Взщз Щщщхш
Общепринятая практика для чего?
Ну проблема то частая я так понимаю.
Я хочу иметь 1 основной файл, где создаются главные объекты, типа bot или dispatcher.
Они уже используют объекты из других файлов (conversations например). Но что, если в conversations изредка нужен объект bot из главного файла. Можно этот объект заново в conversations создать ...
источник

ВЩ

Взщз Щщщхш in SPb Python
Можно создать бота в отдельном модуле bot, от которого зависят dispatcher, conversation и main, но тут опять используются побочные эффекты при импортах.

Можно использовать dependency injection и в каждый модуль передавать бота как аргумент:
# dispatcher.py
def attach_handlers(bot):
   ...

# converstaion.py
def do_something(bot, repository, other_dependency):
   ...

# main.py
from dispatcher import attach_handlers
from conversation import do_something

bot = ...
attach_handlers(bot)
do_something(bot, ..., ...)
bot.run()

Ещё можно определить обработчики в одном файле, а прикрепить их в main.
источник

ВЩ

Взщз Щщщхш in SPb Python
Наверное, лучше спросить в @botoid
источник

D!

Danny !! in SPb Python
David Shiko
Помогите пожалуйста настроить импорты

У менять есть main файл
import conversations
if __name__ == '__main__':
   bot = tg.Bot(token=config.tg_bot_token, request=request)  # , base_url=PROXY_URL)
   updater = Updater(bot=bot, use_context=True)
   dispatcher = updater.dispatcher
   dispatcher.add_handler(conversations.conversation_registration_handler)

и conversations файл

from main import bot
def start_reg():
   bot.get_me()
if __name__ == '__main__':
   conversation_registration_handler = ConversationHandler(
   entry_points=[MessageHandler(Filters.regex(config.reg_r), start_reg)],

       states={
           0: [MessageHandler(Filters.text, user_name)],
           1: [MessageHandler(Filters.text, user_goal)], })

Собственно в таком виде ничего не работает. Особенно смущает, что `name == main`, а не  __main__ у главного файла
Привет, у тебя нет никаких причин выносить конверсейшон в отдельный файл. Но даже если, причин импортировать туда бота тоже нет😂 оно не работает не из-за этого)
источник