2015-07-11 1 views
1

Существует много сообщений, в которых я должен использовать случай __init__.py, и одним из них является определение глобальной переменной.
Но я хочу знать, есть ли недостатки в определении локальной переменной в __init__.py?Определение любой переменной в __init__.py

+0

Что вы подразумеваете под «определением ** локальной ** переменной в' __init __. Py' "? –

ответ

1

Использование глобальных переменных имеет свои проблемы в целом:

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

  • В случае сети подключенных объектов, как правило, более гибко для объектов иметь членов, ссылающихся на другие объекты, а затем для доступа к другим объектам с использованием глобальных переменных.

  • Наличие классов экспорта модулей, а не экземпляров, позволяет иметь несколько экземпляров класса, а не одного.

Сказав это, это мой опыт в том, что в программировании нет догм. Хорошо известная лемма в дизайне алгоритмов заключается в том, что из каждого ресурса (вещи в вашей программе) может быть ноль, один или бесконечно много. Если вы обычно можете иметь только один экземпляр объекта и он не меняет идентификатор, то экспортировать экземпляр из модуля (так что он определяет его в модулях __init__.py) в порядке.

Это просто, что в начале дизайна вы иногда предполагаете, что определенный ресурс уникален, но позже выясняется, что у вас будет несколько.

Типичное применение экспорта переменной, а не типа, когда оно фактически является константой. Хорошим примером этого является math.pi, который не имеет тенденций к изменению очень часто ...

Обратите внимание, что поскольку в Python все является объектом, слова «переменная» и «экземпляр» здесь используются здесь взаимозаменяемо. Кроме того, функции и классы (как правило, одиночные) объекты в своем собственном праве находятся в Python.

2

Нет технической причины, которая предотвращает использование __init__.py для объявления глобальных переменных.

Тем не менее, среднее значение модулей __init__.py заключается в определении структуры импорта вашего приложения. Из документации Python:

Файлы __init__.py необходимы, чтобы Python рассматривал каталоги как содержащие пакеты; это делается для предотвращения каталогов с общим именем, например строки, из непреднамеренного скрытия допустимых модулей, которые появляются позже на пути поиска модуля. В простейшем случае __init__.py может быть просто пустым файлом, но он также может выполнять код инициализации для пакета или задавать переменную __all__, описанную ниже.

Как разработчик, я ожидаю найти в файле __init__.py макет импорта самого приложения. Это последнее место, которое я ищу, когда я изучаю исходный код.

Таким образом, скрыть вашу реализацию в __init__.py вводит в заблуждение. Это особенно верно в отношении глобальной переменной, которой жизненный цикл по определению трудно следовать.

Это считается плохой практикой, потому что нарушает читаемость кода, что является одним из руководящих принципов Python.

import this 
The Zen of Python, by Tim Peters 

Beautiful is better than ugly. 
Explicit is better than implicit. 
Simple is better than complex. 
... 
Readability counts. 
... 
Смежные вопросы