Полезно ли использовать закрытие вместо __all__
, чтобы ограничить имена, открытые модулем Python? Это предотвратило бы случайное использование программистами неправильного имени для модуля (import urllib; urllib.os.getlogin()
), а также избежание загрязнения пространства имен «from x import *
» как __all__
.Является ли закрытие Python хорошей заменой для `__all__`?
def _init_module():
global foo
import bar
def foo():
return bar.baz.operation()
class Quux(bar.baz.Splort): pass
_init_module(); del _init_module
против того же модуля с использованием __all__
:
__all__ = ['foo']
import bar
def foo():
return bar.baz.operation()
class Quux(bar.baz.Splort): pass
функции могли бы просто принять этот стиль, чтобы не загрязнять пространство имен модуля:
def foo():
import bar
bar.baz.operation()
Это может быть полезно для большого пакета который хочет помочь пользователям отличить свой API от использования пакета API его и других модулей во время интерактивной интроспекции. С другой стороны, возможно, IPython должен просто различать имена в __all__
во время завершения табуляции, и больше пользователей должны использовать среду IDE, которая позволяет им переходить между файлами, чтобы увидеть определение каждого имени.
Почему вы не используете 'from bar import foo' в коде с помощью этого модуля? Я чувствую, что мне что-то не хватает ... – jdb
Второй бит кода не использует первый бит кода. он использует '__all__' для определения того же модуля. – joeforker
Я согласен с jdb: какая проблема? Ваш метод _init_module очень странный, и я не понимаю, почему вы беспокоились? Сколько разработчиков случайно используют urllib.os.getlogin, например? Просто напишите свой код и решите реальные проблемы. –