Когда используются названия popeon sunder?

В Python существуют соглашения для одиночного подчеркивания, двойного подчеркивания, двойного указателя + двойного нижнего подчеркивания и одиночного нижнего подчеркивания. Многие из них изложены в ответах на тему Что такое значение single- и двойное подчеркивание перед именем объекта? ,

Но каково значение или условное обозначение для единственного ведущего + единственного нижнего подчеркивания? Я впервые увидел их использование в модуле enum:

8.13.15.3.2. Поддерживаемые имена _sunder_

  • _name_ - имя участника
  • _value_ - значение члена; могут быть установлены/изменены в новых
  • _missing_ - функция поиска, используемая, когда значение не найдено; может быть отменено
  • _ignore_ - список имен, либо как список(), либо str(), которые не будут преобразованы в элементы и будут удалены из окончательного класса
  • _order_ - используется в коде Python 2/3, чтобы гарантировать, что порядок членов согласован (атрибут класса, удаленный при создании класса)
  • _generate_next_value_ - используется функциональным API и автоматически, чтобы получить соответствующее значение для члена перечисления; может быть отменено

Я еще не видел таких single- ведущих single- задних именных ярких имен. Обращаются ли они каким-либо особым образом или иным образом имеют подразумеваемое значение, отличное от любых других соглашений об именах, связанных с подчеркиванием? Как они отличаются от того, что не имеют подчеркивания?

Ответ 1

Они не рассматриваются каким-либо особым образом. Они используются модулем enum для

  • Не быть случайно переопределенным

например

class Status(Enum):
    alive = auto()
    dead = auto()
    missing = auto()

Вы можете видеть, что Status.missing и Status._missing_ - это разные объекты. Если _sunder_ имена _sunder_ были разрешены, мы могли бы случайно переопределить функцию _missing_ что привело бы к неожиданным ошибкам.

  • не отображаются как частные. Имя _value в Python считается частным. Чтобы выразить, что они не являются частными (что, опять же, пользователь может захотеть, чтобы значение перечисления было частным), им вместо этого дают имена sunder

  • другие альтернативы, такие как __double_leading_underscore и __dunder__ также имеют специальные значения в python, как вы указали выше. Методы _sunder_ в Enum действуют подобно протоколам __dunder__ чистого Python, но не зарезервированы языком.

По сути, это возможность избежать конфликтов имен атрибутов, не создавая неправильное впечатление.