Как импортировать братьев и сестер, чтобы python мог запускать как файл, так и скрипты вниз? - PullRequest
1 голос
/ 24 октября 2019

Я не уверен, как отсортировать мои import заявления в следующей ситуации:

main.py
folder/
      __init__.py
      a.py
      b.py

a.py:

class Base(object):
    pass

b.py:

from a import Base  # If I do this, `python main.py` fails with "ModuleNotFoundError: No module named 'a'"
from .a import Base # But if I do this, `python b.py` or `python folder/b.py` fails with "ModuleNotFoundError: No module named '__main__.a'; '__main__' is not a package"

class Kid(Base):
    pass

if __name__ == "__main__":
    # Toy around with Kid (informal test, debug, snippets, etc.)
    k = Kid()

main.py:

from folder.b import Kid
# Main script with Kid.
k = Kid() 

Я иногда хочу запустить main.py, потому что это моя основная программа.
Но я иногда хочу запустить b.py, потому что это проще ион содержит небольшие фрагменты и примеры для игры с моим классом Kid, пока файл открыт.

Я думаю, что законно хотеть и то и другое, иначе не будет смысла в общей конструкции if __name__ == '__main__':.

Каков правильный импорт для b.py? Есть ли способ, которым я могу наслаждаться лучшим из обоих вариантов?

1 Ответ

1 голос
/ 24 октября 2019

Импорт Python может оказаться нелепым, и желание использовать модуль несколькими способами становится затруднительным. Самый простой способ - это просто попробовать / поймать

try:
    from a import Base
except ModuleNotFoundError:
    from .a import Base
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...