Что такое префикс подчеркивания для имени файла python?
В cherryPy
например, есть такие файлы, как:
Как они отличаются? Что это значит?
Ответы
Ответ 1
__...__
означает зарезервированное имя Python (как в именах файлов, так и в других именах). Вы не должны изобретать свои собственные имена, используя обозначение с двойным подчеркиванием; и если вы используете существующие, у них есть специальные функции.
В этом конкретном примере __init__.py
определяет "основное" устройство для пакета; это также приводит к тому, что Python обрабатывает конкретный каталог как пакет. Это устройство, которое будет использоваться, когда вы вызываете import cherryPy
(и cherryPy
- это каталог). Это кратко объясняется в Учебник по модулям.
Другим примером является метод __eq__
, который обеспечивает сравнение равенства для класса. Вы можете напрямую вызвать эти методы (и используете их неявно, например, при использовании оператора ==
); однако более новые версии Python могут определять больше таких методов, и поэтому вы не должны изобретать свои собственные __
-names, потому что они могут столкнуться. Вы можете найти довольно подробный список таких методов в Data model docs.
_...
часто используется как "внутреннее" имя. Например, модули, начинающиеся с _
, не должны использоваться напрямую; аналогично, методы с _
предположительно являются частными и так далее. Это просто конвенция, но вы должны ее уважать.
Ответ 2
Эти и другие соглашения об именах подробно описаны в Руководство по стилю для кода Python - Описательные: стили именования
Коротко:
-
__double_leading_and_trailing_underscore__
: "волшебные" объекты или атрибуты, которые находятся в контролируемых пользователем пространствах имен. Например, __init__
, __import__
или __file__
. Никогда не изобретайте такие имена; используйте их только как задокументированные.
-
_single_leading_underscore
: слабый индикатор "внутреннего использования". Например. from M import *
не импортирует объекты, имя которых начинается с подчеркивания.
Ответ 3
__init__.py
- это специальный файл, который, когда существующий в папке превращает эту папку в модуль. При импорте модуля выполняется __init__.py
. Другой - это просто соглашение об именах, но я бы предположил, что это скажет, что вы не должны напрямую импортировать этот файл.
Взгляните сюда: 6.4. Пакеты для объяснения того, как создавать модули.
Общее правило: если что-либо в Python является namend __anything__
, то это что-то особенное, и вы должны прочитать об этом перед его использованием (например, магические функции).
Ответ 4
Текущий выбранный ответ уже дал хорошее объяснение в нотации с двойным подчеркиванием для __init__.py
.
И я полагаю, что нет никакой необходимости в записи _cptools.py
в имени файла. Предположительно, это ненужное расширенное использование правила "одиночное подчеркивание" из Руководства по стилю для кода Python. Описательное: Стили именования:
-
_single_leading_underscore
: слабый индикатор "внутреннего использования". Например, from M import *
не импортируются объекты, имя которых начинается с подчеркивания.
Во всяком случае, упомянутое руководство по стилю на самом деле против использования _single_leading_underscore.py
в имени файла. В разделе "Имена пакетов и модулей" такое использование упоминается только в том случае, если модуль реализован в C/C++.
В общем, это обозначение _single_leading_underscore
обычно наблюдается в именах функций, именах методов и переменных-членах, чтобы отличать их от других обычных методов.
Существует _single_leading_underscore.py
потребность (если она вообще есть) использовать _single_leading_underscore.py
для имени файла, поскольку разработчики не являются _single_leading_underscore.py
файлов, они вряд ли спасут файл, основываясь на его имени файла. Они просто следовали бы за API-интерфейсом самого высокого уровня пакета (технически говоря, его открытые сущности определены как __all__
), поэтому все имена файлов даже не заметны, не говоря уже о том, чтобы определить, будет ли использоваться файл (то есть модуль).