2013-03-21 3 views
0

Я написал два модуля m1.py и m2.py, каждый из которых использует различные модули из стандартной библиотеки.Python (2.7): как избежать импорта импортируемых модулей в качестве части моих модулей?

Например

#m1.py 
import sys 
#. 
#. 

и

#m2.py 
import os 
#. 
#. 

Что "надоедает" меня является то, что, когда я импортировать в main.py два модуля m1.py и m2.py я могу использовать функции, определенные в sys и os, такие как:

#main.py 
print m1.sys.version 
print m2.os.listdir() 

Это нормально, или я должен сотрудничать nsider при импорте модулей в моем коде?

ответ

1

Обычно вам не нужно беспокоиться о том, что доступно в вашем пространстве имен. Любой, кто сталкивается с вещами, которые не являются частью документального API модуля, заслуживает любых проблем, которые они получают. Python предполагает, что программисты отвечают за взрослых.

Исключением является то, что вы специально хотите разрешить другому коду использовать иначе обескураженный синтаксис from mymodule import *. Затем вы хотите ограничить то, что является общедоступным, чтобы вы не загромождали пространства имен вашего импортера своими собственными внутренними вещами.

Вот как вы можете сделать это:

  • Имена, которые начинаются с символа подчеркивания (например, _foo) считаются частными, и не будут импортированы с from mymodule import *. Это не «настоящая» конфиденциальность, так как любой, кто выполняет обычный импорт, все равно сможет получить к ним доступ через mymodule._foo (но они, вероятно, не должны!).

  • Если вы хотите, чтобы модули, которые вы импортировали, были приватными, используйте предложение as, чтобы дать им «личное» имя, как описано выше. То есть, используйте import os as _os.

  • Или, вместо того, чтобы возиться с символами подчеркивания, вы можете создать переменную __all__, которая явно отображает общедоступные имена модуля. Только имена в списке будут импортированы с помощью инструкции from mymodule import *. Обратите внимание, что в пакетах требуется последовательность __all__, если вы хотите, чтобы подмодули были импортированы через from mypackage import *. Это связано с тем, что Python не может доверять файловой системе, чтобы не перепутаться с капитализацией имен файлов, содержащихся в пакете.