Что такое префикс подчеркивания для имени файла python?

В cherryPy например, есть такие файлы, как:

  • __init__.py
  • _cptools.py

Как они отличаются? Что это значит?

Ответы

Ответ 1

__...__ означает зарезервированное имя Python (как в именах файлов, так и в других именах). Вы не должны изобретать свои собственные имена, используя обозначение с двойным подчеркиванием; и если вы используете существующие, у них есть специальные функции.

В этом конкретном примере __init__.py определяет "основное" устройство для пакета; это также приводит к тому, что Python обрабатывает конкретный каталог как пакет. Это устройство, которое будет использоваться, когда вы вызываете import cherryPycherryPy - это каталог). Это кратко объясняется в Учебник по модулям.

Другим примером является метод __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__), поэтому все имена файлов даже не заметны, не говоря уже о том, чтобы определить, будет ли использоваться файл (то есть модуль).