В Python существуют соглашения для одинарного подчеркивания в начале, двойного подчеркивания в начале, двойного подчеркивания в начале + двойного подчеркивания в конце и одинарного подчеркивания в конце. Многие из них описаны в ответах на странице . В чем смысл одинарного и двойного подчеркивания перед именем объекта?.
Но каково значение или соглашение для одиночного начального + одиночного нижнего подчеркивания? Впервые я увидел их использование в модуле enum
. :
8.13.15.3.2. Поддерживаемые
_sunder_
имена
_name_
– имя участника_value_
– значение члена; можно установить/изменить в новом_missing_
– функция поиска, используемая, когда значение не найдено; может быть переопределен_ignore_
— список имен в виде list() или str(), которые не будут преобразованы в члены и будут удалены из окончательного класса_order_
— используется в коде Python 2/3 для обеспечения согласованности порядка элементов (атрибут класса, удаленный во время создания класса)_generate_next_value_
— используется функциональным API и auto для получения соответствующего значения члена перечисления; может быть переопределен
Я никогда раньше не видел таких имен с одним подчеркиванием в начале и в конце. Обрабатываются ли они каким-либо особым образом или имеют иное подразумеваемое значение, отличное от любых других соглашений об именах, связанных с подчеркиванием? Чем они отличаются от отсутствия подчеркивания вообще?
_name_
и_value_
являются атрибутами типаEnum
, а не метаклассаEnumMeta
.class Test(Enum): a = 0
, затемTest.a._name_ == 'a'
,Test._name_
однако даетAttributeError
. Я вижу, как нужно предотвращать конфликты имен атрибутов вEnumMeta
, но где риск конфликта в результирующем типеEnum
? 24.08.2018Test.a.name
иTest.a.value
тоже работают, так что_name_
и_value_
— это просто синонимыname
иvalue
соответственно. 24.08.2018Enum
, я одобряю этот ответ. ;-) 24.08.2018_repr_jpeg_
и_repr_html_
, чтобы обеспечить индивидуальный рендеринг для совместимых объектов Python в расширенной среде REPL (подробности см. на странице ipython.readthedocs.io/en/stable/config/integrating.html выше.) 12.06.2019