Можно ли избежать импорта файла с from file import function
? Кто-то сказал мне, что мне нужно поставить подчеркивание в качестве префикса, например: _function
, но это не работает.
Я использую Python 2.6 из-за устаревшего кода.
Можно ли избежать импорта файла с from file import function
? Кто-то сказал мне, что мне нужно поставить подчеркивание в качестве префикса, например: _function
, но это не работает.
Я использую Python 2.6 из-за устаревшего кода.
from .. import *
, используя __all__
(и ведущие символы подчеркивания). Изменение имени также связан. 19.01.2017 Есть способы предотвратить импорт, но они, как правило, являются хакерами, и вы должны избегать их. Обычный метод - просто использовать подчеркивание:
def _function():
pass
Затем, когда вы импортируете,
from my_module import *
Вы заметите, что _function
не импортируется, поскольку начинается с подчеркивания. Однако вы всегда можете сделать это:
# In Python culture, this is considered rude
from my_module import _function
Но ты не должен этого делать. Просто не делай этого, и все будет хорошо. Отношение Питона в том, что мы все взрослые люди. Есть много других вещей, которые вы не должны делать, которые намного хуже, например
import my_module
# Remove the definition for _function!
del my_module._function
В Python нет конфиденциальности. Существуют только соглашения, определяющие, какой внешний код должен считаться общедоступным и пригодным для использования.
Импорт модуля в первый раз вызывает создание объекта модуля и выполнение всего кода верхнего уровня в модуле. Объект модуля содержит глобальное пространство имен с результатом выполнения этого кода.
Поскольку Python динамичен, вы всегда можете самостоятельно изучить пространство имен модуля; вы можете видеть все определенные имена, все объекты, на которые ссылаются эти имена, и вы можете получить доступ и изменить все. Здесь не имеет значения, начинаются эти имена с подчеркивания или нет.
Таким образом, единственная причина, по которой вы используете подчеркивание _
в начале имени, заключается в том, чтобы документировать, что имя является внутренним для реализации модуля, и что внешний код не должен полагаться на это имя, существующее в будущем. версия. Синтаксис from module import *
будет игнорировать такие имена только по этой причине. Но вы все равно не можете помешать целеустремленному программисту получить доступ к такому имени. Они просто делают это на свой страх и риск, вы не несете ответственности за то, чтобы не допустить их к этому.
Если у вас есть функции или другие объекты, которые нужны только для инициализации модуля, вы, конечно, можете удалить эти имена в конце.