Nano Hash - криптовалюты, майнинг, программирование

Когда используются имена python sunder?

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

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

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

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

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


Ответы:


1

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

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

e.g.

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

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

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

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

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

24.08.2018
  • Но _name_ и _value_ являются атрибутами типа Enum, а не метакласса EnumMeta. class Test(Enum): a = 0, затем Test.a._name_ == 'a', Test._name_ однако дает AttributeError. Я вижу, как нужно предотвращать конфликты имен атрибутов в EnumMeta, но где риск конфликта в результирующем типе Enum? 24.08.2018
  • Кроме того, Test.a.name и Test.a.value тоже работают, так что _name_ и _value_ — это просто синонимы name и value соответственно. 24.08.2018
  • Как автор Enum, я одобряю этот ответ. ;-) 24.08.2018
  • Стоит отметить, что популярная среда Jupyter REPL и визуализация (которая включает в себя IPython под своей мощной эгидой) довольно широко использует свойства и методы, названные «sunder», например. _repr_jpeg_ и _repr_html_, чтобы обеспечить индивидуальный рендеринг для совместимых объектов Python в расширенной среде REPL (подробности см. на странице ipython.readthedocs.io/en/stable/config/integrating.html выше.) 12.06.2019
  • @gerrit: Ответ на ваши вопросы более сложен, чем я хочу в комментарии. Если вы зададите это как новый вопрос, я буду рад ответить. 24.07.2019
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..