Python: мне нужно лучше понять импорт и пакеты - PullRequest
2 голосов
/ 12 августа 2011

Моя программа имеет структуру, подобную этой:

myapp.py
basemod.py
[pkg1]
    __init__.py
    mod1.py
[pkg2]
    __init__.py
    mod2.py

myapp.py:

import pkg1
import pkg2

if __name__ == '__main__':
    pkg1.main()
    pkg2.main()

basemod.py:

import pkg1


def get_msg():
    return pkg1.msg

pkg1/__init__.py:

import mod1

msg = None


def main():
    global msg
    mod1.set_bar()
    msg = mod1.bar

pkg1/mod1.py:

bar = None


def set_bar():
    global bar
    bar = 'Hello World'

pkg2/__init__.py:

import mod2


def main():
    mod2.print_foo()

pkg2/mod2.py:

import basemod

foo = basemod.get_msg()


def print_foo():
    print(foo)

Если я запускаю myapp.py, я получаю:

None

Пока я думаю, я бы ожидал:

Hello World

Моя цель - сохранить два пакета полностью независимыми друг от друга,и только через basemod.py, который является своего рода API для pkg1.
Я начинаю думать, что я не до конца понял, как работает импорт между пакетами, что я делаю неправильно?

Спасибо!

1 Ответ

5 голосов
/ 12 августа 2011

Мне понадобилось время, чтобы прочитать весь этот код, но похоже, что ваша проблема в pkg2 / mod2.py.Строка foo = basemod.get_msg() выполняется в первый раз, когда файл импортируется, и никогда больше.Таким образом, к моменту изменения значения mod1.bar оно уже выполнено, и foo равно None.

. Решение должно состоять в том, чтобы просто переместить эту строку в функцию print_foo, поэтомуона выполняется только тогда, когда вызывается эта функция - после кода, который устанавливает соответствующее значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...