Может кто-нибудь объяснить __all__ в Python?

Для обратного преобразования используйте binascii.b2a_hex (obj)

808
задан varikin 3 March 2016 в 17:52
поделиться

4 ответа

Это - список общедоступных объектов того модуля, как интерпретируется import *. Это переопределяет значение по умолчанию сокрытия всего, что начинается с подчеркивания.

434
ответ дан Jimmy 3 March 2016 в 17:52
поделиться

Связанный с, но не явно упомянутый здесь, точно, когда __all__ используется. Это - список строкового определения, какие символы в модуле будут экспортироваться, когда from <module> import * будет использоваться на модуле.

, Например, следующий код в foo.py явно экспорт символы bar и baz:

__all__ = ['bar', 'baz']

waz = 5
bar = 10
def baz(): return 'baz'

Эти символы могут тогда быть импортированы как так:

from foo import *

print(bar)
print(baz)

# The following will trigger an exception, as "waz" is not exported by the module
print(waz)

, Если __all__ выше комментируется, этот код тогда выполнится к завершению, поскольку поведение по умолчанию import * состоит в том, чтобы импортировать все символы, которые не начинаются с подчеркивания от данного пространства имен.

Ссылка: https://ПРИМЕЧАНИЕ docs.python.org/tutorial/modules.html#importing-from-a-package

: __all__ влияние from <module> import * поведение только. Участники, которые не упоминаются в [1 111], все еще доступны снаружи модуля и могут быть импортированы с [1 112].

822
ответ дан Boris 3 March 2016 в 17:52
поделиться

От (Неофициальное) Ссылочный Wiki Python:

общедоступные имена, определенные модулем, определяются путем проверки пространства имен модуля на переменную, названную __all__; если определено, это должна быть последовательность строк, которые являются именами, определенными или импортированными тем модулем. Имена, данные в __all__, все считаются общедоступными и требуются, чтобы существовать. Если __all__ не определяется, набор общедоступных имен включает все имена, найденные в пространство имен модуля, которые не начинаются с символа подчеркивания (" _ "). __all__ должен содержать весь общедоступный API. Это предназначается, чтобы не случайно экспортировать объекты, которые не являются частью API (такого как модули библиотеки, которые импортировались и использовались в модуле).

50
ответ дан Pavol Babincak 3 March 2016 в 17:52
поделиться

Это также изменяет то, что покажет pydoc:

module1.py

a = "A"
b = "B"
c = "C"

module2.py

__all__ = ['a', 'b']

a = "A"
b = "B"
c = "C"

$ pydoc module1

Help on module module1:

NAME
    module1

FILE
    module1.py

DATA
    a = 'A'
    b = 'B'
    c = 'C'

$ pydoc module2

Help on module module2:

NAME
    module2

FILE
    module2.py

DATA
    __all__ = ['a', 'b']
    a = 'A'
    b = 'B'

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

85
ответ дан 22 November 2019 в 21:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: