Делая все переменные в области видимости глобальными или импортируя модуль в другой модуль - PullRequest
0 голосов
/ 23 сентября 2010

У меня есть пакет с двумя модулями.Одним из них является файл __init__, а другим - отдельная часть пакета.Если я попробую from mypackage import separatepart, будет запущен код в модуле __init__, который будет запускать ненужный код, значительно замедляя импорт.Код в отдельной части не вызовет никаких ошибок, поэтому пользователи должны иметь возможность напрямую импортировать его без импорта модуля __init__.

Поскольку я не могу найти способ сделать это, я подумал, что должен включить в файл __init__ функцию, которая делает все, чтобы ничего не делалось напрямую, но для этогопотребуется иметь любые переменные, которые будут глобальными.Есть ли способ сообщить Python, что все переменные являются глобальными в функции, или не запускать модуль __init__?

1 Ответ

1 голос
/ 23 сентября 2010

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

#module.py

foo = bar = 0 # global

def init()
    import module as m

    m.foo = 1
    m.bar = 2 # access to globals

если init был вызван на верхнем уровне, то у вас бесконечная рекурсия, но похоже, что весь смысл в том, чтобы избежать запуска этого кода на верхнем уровне, поэтому вы должны быть в безопасности. Поскольку вы хотите сделать это в файле __init__.py, просто импортируйте верхний уровень пакета.

Во время прогулки мне пришло в голову, что здесь нет проблем с рекурсией, потому что код верхнего уровня будет запускаться только один раз при первоначальном импорте.

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