Когда используются имена python sunder? - PullRequest
0 голосов
/ 24 августа 2018

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

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

8.13.15.3.2. Поддерживаются _sunder_ имена

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

Раньше я не встречал таких имен: "1039 * sunder " Обращаются ли они каким-либо особым образом или иным образом имеют подразумеваемое значение, которое отличается от любых других соглашений об именах, связанных с подчеркиванием? Чем они вообще отличаются от подчеркивания?

1 Ответ

0 голосов
/ 24 августа 2018

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

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

например,

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

Вы можете видеть, что Status.missing и Status._missing_ разные объекты.Если бы метод Enum _missing_ был назван missing, мы бы переопределили его.

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

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

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

...