5 способов использования подчеркивания (_) в Python


В чем смысл одиночного и двойного подчеркивания перед именем объекта?

Может ли кто-то объяснить, что именно имеет значение подчеркивания перед именем объекта в Python? Также объясните разницу между одиночным и двойным лидирующим подчеркиванием. Кроме того, имеет ли смысл то же самое, является ли рассматриваемый объект переменной, функцией, методом и т.д.?

Одиночный подшерсток

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

_single_leading_underscore: слабый индикатор «внутреннего использования». Например, from M import * не импортируется объект, имя которого начинается с символа подчеркивания.

Double Underscore (Name Mangling)

Любой идентификатор формы __spam (по крайней мере два ведущих __spam подчеркивания, не более одного нижнего подчеркивания) заменяется _classname__spam , где classname — это текущее имя класса с _classname__spam подчеркиваниями. Это манипулирование выполняется без учета синтаксической позиции идентификатора, поэтому его можно использовать для определения переменных класса, класса, переменных, хранящихся в глобальных переменных, и даже переменных, хранящихся в экземплярах. частный для этого класса на экземплярах других классов.

И предупреждение с той же страницы:

Назначение имени предназначено для того, чтобы дать классам простой способ определить «частные» переменные экземпляра и методы, не беспокоясь о переменных экземпляра, определяемых производными классами, или обманывать переменные экземпляра кодом вне класса. Обратите внимание, что правила манипуляции предназначены главным образом для предотвращения несчастных случаев; все еще возможно, чтобы решительная душа могла получить доступ или изменить переменную, которая считается частной.

пример

Отличные ответы до сих пор, но некоторые лакомые кусочки отсутствуют. Единственное ведущее подчеркивание — это не просто соглашение: если вы используете from foobar import * , а модуль foobar не определяет список __all__ , имена, импортированные из модуля не, включают те с лидирующим подчеркиванием. Скажем, это в основном соглашение, так как этот случай — довольно неясный угол; -).

Соглашение о подчеркивании широко используется не только для частных имен, но и для того, что С++ вызывает защищенные — например, имена методов, которые полностью предназначены для переопределения подклассами (даже те, которые есть, поскольку в базовом классе они raise NotImplementedError ! -) часто являются именами с одним ведущим-underscore, указывающим на код с использованием экземпляров этого класса (или подклассов), который сказал методы не должны вызываться напрямую.

Какова цель единственной подчеркивания «_» в Python?

Каково значение _ после for в этом коде?

4 ответа

_ имеет 3 основных традиционных использования в Python:

  1. Чтобы сохранить результат последнего выполненного выражения (/ оператор) в сеансе интерактивного интерпретатора. Этот прецедент был установлен стандартным интерпретатором CPython, и другие интерпретаторы последовали его примеру
  2. Для поиска перевода в i18n (см., Например, документацию gettext), как в коде: raise forms.ValidationError(_(«Please enter a correct username»))
  3. В качестве универсального имени переменной «throwaway», чтобы указать, что часть результата функции намеренно игнорируется, как в коде, подобном следующему: label, has_label, _ = text.partition(‘:’)

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

о python, it, виртуализации и Co

блог о python, виртуализации, программировании и другом

December 12, 2013

Подчеркнутая защищенность

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

Компилируемые языки реализуют инкапсуляцию методом принуждения. Программист отмечает методы и поля как личные или защищенные, а компилятор играет в большого брата и проверяет что все используется в корректном контексте. На моей памяти война за способ использования private/protected минимум пару раз принимала нешуточный оборот.

Попадая в питон С++/Java-программисты начинают искать замену родным private/protected в этом мире безудержного эксгибиционизма. И, как правило, быстро находят два подчеркивания. Не совсем то, что хотелось бы, но довольно сильно похоже на private. В итоге нижнее подчеркивание быстро становится самым популярным символом в коде.

Я попробую показать, что:

  • ‘__’ — не эквивалент private и решает совсем другие задачи;
  • Можно отлично жить без private/protected/friend. Оружие массового запрещения не единственный способ реализовать инкапсуляцию;
  • При желании можно написать аналог private/protected и даже более гибкий контроль доступа для python (в следующем посте)

Итак зачем в python поля с двумя подчеркиваниями в начале имени. Пусть у нас есть такой код:

Допустим код SomeClass очень большой или нам не доступен или постоянно неконтролируемо меняется или по любой другой причине мы не может быть уверенны, что какое бы благозвучное имя не было выбрано для some_field мы не можем быть уверенны, что не затрем поле с таким же именем в родительском классе. Компилируемый язык решил бы эту проблему, не позволив нам создать поле, если поле с таким именем уже унаследовано. Это не решает проблему полностью, но избавляет нас от странного поведения.

Для этого в питоне и есть поля с двумя подчеркиваниями в начале (но без двух подчеркиваний в конце). Когда компилятор питона видит подобное имя он дописывает к нему в начало еще одно подчеркивание и имя текущего компилируемого класса. Это можно увидеть с помощью питоновского дизассемблера:

Итого ‘__’ приводит к переименованию поля и позволяет использовать поля с одинаковыми именами в разных классах одной иерархии. Но это не мешает добраться до такого поля, например x._X__some_priv_field. BTW — если нужно сделать действительно скрытое поле, то можно и так:

self.__dict__ — обычный словарь и ключами в нем могут быть не только строки. Злоупотреблять таким хаком не стоит поскольку много различных библиотек, например сериализаторы, сильно удивятся увидев в __dict__ нестроковой ключ.

Итак: ‘__’ — это очень специфический аналог частного поля и он предназначен для несколько других целей.

Модификаторы доступа защищают программиста от случайного и преднамеренного доступа к тем частям API, которые разработчик класса захотел скрыть.

Начнем со случайного доступа на примере С++. Случайно в нем можно вызвать:

  • конструктор (присваиванием, в контейнере при копировании, etc)
  • деструктор (по выходу объекта или его владельца из области видимости)
  • оператор преобразования типа
  • опечатавшись, скопировав неправильно код, etc

Последний пункт скорее из области фантастики. Все остальные тоже не применимы к питону. Питон не копирует объекты, все всегда передается и хранится по ссылке, deepcopy/loads не вызывают конструктор. Деструктор вызывается непонятно когда и чаще всего его вызов сложно контролировать. Доступ к имеющиеся преобразования типов бессмысленно запрещать (__str__, __int__). Так что операции, выполняемые питоном без явного указания программиста не особо нуждаются в разграничении доступа.

Мастер Йода рекомендует:  PHP самоучитель

Кроме того в С++ в указанных случаях мы получим ошибку на этапе компиляции, а в случае с питоном — в этапе исполнения, когда уже будет не очень понятно что с нею делать.

Перейдем к преднамеренному вызову защищенного метода. Если очень хочется, то никакой private/protected не остановит:

Есть еще 666 способов добраться до защищенного метода. Есть они и в Java (reflections) и в C#, иначе контейнеры внедрения зависимостей не смогли бы работать.

Итого — бессмысленно защищаться и от преднамеренного вызова. Всегда есть способ обойти такую защиту. Да и если кто-то очень хочет — пусть вызывает. А для защиты от случайного вызова обычно достаточно просто не упоминать метод/поле в документации.

Документация — первая линия инкапсуляции в python.

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

Наконец очень распространенный способ посмотреть что можно сделать с объектом это интроспекция. Например, если нажать после x. в ipython, то он покажет какие поля и методы есть у объекта x. Для управлением видимостью методов/полей в случае такой интроспекции в питоне есть метод __dir__:

Интроспеция — вторая линия инкапсуляции в python.

Пользуйтесь этими способами и не засоряйте питон подчеркиваниями. В следующем посте мы объединим автоматизируем dir и сделаем для питона аналог private.

соглашения об именах python о подчеркивании [дубликат]

В чем смысл _ после for в этом коде?

4 ответа

_ имеет 3 основных обычных использования в Python:

  1. Чтобы удерживать результат последнего выполненного выражения (/ statement) в сеансе интерактивного интерпретатора. Этот прецедент был установлен стандартным интерпретатором CPython, а другие интерпретаторы последовали его примеру
  2. . Для поиска перевода в i18n (см., Например, документацию gettext ), как в коде типа: raise forms.ValidationError(_(«Please enter a correct username»))
  3. Как общее имя переменной «throwaway», чтобы указать, что часть результата функции умышленно игнорируется, как в коде типа: label, has_label, _ = text.partition(‘:’)

Последние две цели могут конфликтовать, поэтому необходимо избегать использования _ в качестве альтернативной переменной в любом кодовом блоке, который также использует его для перевода i18n (многие люди предпочитают двойное подчеркивание, __ , как свою переменную throwaway для именно по этой причине).

Это просто имя переменной, и в python принято использовать _ для переменных throwaway. Это просто указывает, что переменная цикла фактически не используется.

Какова цель единого подчеркивания «_» переменной в Python?

Что такое значение _ AFTER for в этом коде?

_ имеет 3 основных традиционных применений в Python:

  1. Чтобы удержать результат последнего выполненного выражения (/ заявление) в интерактивном режиме интерпретатора. Этот прецедент был установлен стандартный интерпретатор CPython, и другие переводчики последовали их примеру
  2. Для поиска перевода в i18n (см GetText документацию к примеру), так как в коде , как: raise forms.ValidationError(_(«Please enter a correct username»))
  3. В качестве общего назначения «холостым» имя переменной, чтобы указать, что часть результата функции будет сознательно игнорируется, так как в коде, как: label, has_label, _ = text.partition(‘:’)

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

Это просто имя переменное, и это принято в питоне использовать _ для бросовых переменных. Это просто означает , что переменная цикла фактически не используется.

Подчеркивание _ рассматривается как « я не забочусь » или « холостые » переменной в Python

  • Интерпретатор Python хранит последнее значение выражения в специальной переменной _ .
  • Подчеркивание _ также используется для игнорирования конкретных значений. Если вам не нужны конкретные значения или значения не используются, просто присвоить значения для подчеркивания.

Игнорировать значение при распаковке

for _ in range(10):
do_something()

Есть 5 случаев для использования подчеркивания в Python.

Для хранения значения последнего выражения в переводчике.

Для игнорирования конкретных значений. (Так называемый «Меня не волнует»)

Чтобы дать специальные значения и функции для имени vartiables или функций.


Для того, чтобы использовать в качестве «интернационализации (i18n)» или «Локализация (l10n)» функций.

Для разделения цифр номера буквенного значения.

Вот хорошая статья с примерами по mingrammer .

python подчеркиванием В чем смысл одиночного и двойного подчеркивания перед именем объекта?

python переменная_ (12)

Может ли кто-нибудь объяснить точный смысл наличия подчеркивания перед именем объекта в Python? Также объясните разницу между одиночным и двойным лидирующим подчеркиванием. Кроме того, имеет ли смысл то же самое, является ли рассматриваемый объект переменной, функцией, методом и т. Д.?

Answer #1

Одиночный подшерсток

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

_single_leading_underscore: слабый индикатор «внутреннего использования». Например, from M import * не импортируется объект, имя которого начинается с символа подчеркивания.

Double Underscore (Name Mangling)

Любой идентификатор формы __spam (по крайней мере два ведущих __spam подчеркивания, не более одного нижнего подчеркивания) заменяется _classname__spam , где classname — это текущее имя класса с _classname__spam подчеркиваниями. Это манипулирование выполняется без учета синтаксической позиции идентификатора, поэтому его можно использовать для определения переменных класса, класса, переменных, хранящихся в глобальных переменных, и даже переменных, хранящихся в экземплярах. частный для этого класса на экземплярах других классов.

И предупреждение с той же страницы:

Назначение имени предназначено для того, чтобы дать классам простой способ определить «частные» переменные экземпляра и методы, не беспокоясь о переменных экземпляра, определяемых производными классами, или обманывать переменные экземпляра кодом вне класса. Обратите внимание, что правила манипуляции предназначены главным образом для предотвращения несчастных случаев; все еще возможно, чтобы решительная душа могла получить доступ или изменить переменную, которая считается частной.

пример

Answer #2

Если вы действительно хотите сделать переменную только для чтения, IMHO лучшим способом было бы использовать свойство (), только с переданным ему геттером. С свойством () мы можем иметь полный контроль над данными.

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

Answer #3

Подчеркивание (_) в Python

Ниже приведены разные места, где _ используется в Python:

Single Underscore:

  • В переводчике
  • После названия
  • Перед именем

Double Underscore:

до после

В переводчике:

_ возвращает значение последнего выполненного значения выражения в Python REPL

Для игнорирования значений:

Несколько раз мы не хотим, чтобы возвращаемые значения в это время присваивали эти значения wnderscore. Он используется как переменная.

Мастер Йода рекомендует:  «Use the index, Luke» подборка книг по SQL и теории баз данных

После названия

У Python есть свои ключевые слова по умолчанию, которые мы не можем использовать в качестве имени переменной. Чтобы избежать такого конфликта между ключевыми словами и переменной python, мы используем символ подчеркивания после имени

Пример:

Перед именем

Leading Underscore перед именем variable / function / method указывает программисту, что он предназначен только для внутреннего использования, который может быть изменен всякий раз, когда требуется класс.

Здесь префикс имени by underscore рассматривается как непубличный. Если указать из Import *, все имя начинается с _, не будет импортироваться.

Python не указывает действительно частный, так что это могут быть вызовы непосредственно из других модулей, если они указаны во всех , мы также называем это слабым Private

Вызов файла из REPL

__leading_double_underscore

Ведущий двойной символ подчеркивает интерпретатор python для перезаписи имени, чтобы избежать конфликта в подклассе. Interpreter изменяет имя переменной с расширением класса и эту функцию, известную как Mangling. testFile.py

В интерпретаторе Python Mangling измените имя переменной на ___. Таким образом, множественное время используется как частный член, потому что другой класс не может напрямую обращаться к этой переменной. Основной целью __ является использование переменной / метода только в классе. Если вы хотите использовать его вне класса, вы можете сделать публичный api

__ДО ПОСЛЕ__

Имя с началом с __ и заканчивается тем же, что и специальные методы в Python. Python предоставляет эти методы для использования в качестве перегрузки оператора в зависимости от пользователя.

Python предоставляет это соглашение для различения определяемой пользователем функции с функцией модуля

Answer #4

«Частные» переменные экземпляра, к которым невозможно получить доступ, кроме как внутри объекта, не существуют в Python. Тем не менее, существует соглашение, за которым следует большинство кода Python: имя с префиксом подчеркивания (например, _spam) должно рассматриваться как непубличная часть API (будь то функция, метод или элемент данных) , Его следует рассматривать как деталь реализации и могут быть изменены без предварительного уведомления.

Answer #5

Ваш вопрос хорош, речь идет не только о методах. Функции и объекты в модулях обычно имеют префикс с одним символом подчеркивания и могут быть префиксными двумя.

Но имена __double_underscore, например, не обрабатываются именами в модулях. Случается, что имена, начинающиеся с одного (или более) подчеркивания, не импортируются, если вы импортируете все из модуля (из импорта модуля *), а также имена, указанные в справке (модуле).

Answer #6

Отличные ответы до сих пор, но некоторые лакомые кусочки отсутствуют. Единственное подчеркивание — это не просто соглашение: если вы используете from foobar import * , а модуль foobar не определяет список __all__ , имена, импортированные из модуля , не включают те, у которых есть лидирующий символ подчеркивания. Предположим, что это в основном конвенция, так как этот случай — довольно неясный угол ;-).

Соглашение о подчеркивании широко используется не только для частных имен, но и для того, что C ++ вызывает защищенные — например, имена методов, которые полностью предназначены для переопределения подклассами (даже те, которые должны быть переопределены, поскольку в базовый класс, который они raise NotImplementedError ! -) часто являются именами с одним ведущим-подчеркиванием, указывающим на код с использованием экземпляров этого класса (или подклассов), в котором упомянутые методы не предназначены для прямого вызова.

Например, чтобы создать потокобезопасную очередь с различной дисциплиной очередей, чем FIFO, один импортирует Queue, подклассы Queue.Queue и переопределяет такие методы, как _get и _put ; «клиентский код» никогда не вызывает эти методы («крючок»), а скорее («организует») общедоступные методы, такие как put и get (это называется шаблоном проектирования шаблона шаблона — см. here интересную презентацию на основе видео разговора о моей теме, с добавлением кратковременных расшифровок).

Answer #7

Вот простой иллюстративный пример того, как свойства двойного подчеркивания могут влиять на унаследованный класс. Итак, со следующей настройкой:

если вы затем создадите дочерний экземпляр в REPL python, вы увидите ниже

Это может быть очевидным для некоторых, но это заставило меня остерегаться в гораздо более сложной среде

Answer #8

__foo__ : это просто соглашение, способ использования системы Python для имен, которые не будут конфликтовать с именами пользователей.

_foo : это просто соглашение, способ для программиста указать, что переменная является частной (что бы это ни значило в Python).

__foo : это имеет реальное значение: интерпретатор заменяет это имя на _classname__foo , чтобы гарантировать, что имя не будет перекрываться с похожим именем в другом классе.

Никакая другая форма подчеркивания не имеет смысла в мире Python.

В этих соглашениях нет разницы между классом, переменной, глобальным и т. Д.

Answer #9

Иногда у вас есть то, что кажется кортежем с лидирующим подчеркиванием, как в

В этом случае, что происходит, является то, что _ () является псевдонимом для функции локализации, которая работает с текстом, чтобы перевести его на правильный язык и т. Д. На основе языкового стандарта. Например, Sphinx делает это, и вы найдете среди импорта

и в sphinx.locale _ () назначается как псевдоним некоторой функции локализации.

Answer #10

Единичные подчеркивания — это конвенция. нет никакой разницы с точкой интерпретатора, если имена начинаются с одного подчеркивания или нет.

Двойные ведущие и завершающие символы подчеркивания используются для встроенных методов, таких как __init__ , __bool__ и т. Д.

Двойным лидирующим подчеркиванием без трейлинг-аналогов тоже является соглашение, однако методы класса будут mangled интерпретатором. Для переменных или базовых имен функций разница не существует.

Answer #11

Поскольку так много людей относятся к разговору Раймонда, я просто сделаю это немного легче, записав то, что он сказал:

Цель двойных подчеркиваний заключалась не в конфиденциальности. Цель заключалась в том, чтобы использовать его точно так же

На самом деле это противоположность конфиденциальности, это все о свободе. Это позволяет вашим подклассам свободно переопределять любой метод, не нарушая других .


Скажите, что вы не храните локальную ссылку на perimeter в Circle . Теперь производный класс Tire переопределяет реализацию perimeter , не касаясь area . Когда вы вызываете Tire(5).area() , теоретически он все равно должен использовать Circle.perimeter для вычисления, но на самом деле он использует Tire.perimeter , который не является предполагаемым поведением. Вот почему нам нужна локальная ссылка в Circle.

Но почему __perimeter вместо _perimeter ? Поскольку _perimeter все еще дает производному классу возможность переопределить:

Двойное подчеркивание имеет название mangling, поэтому есть очень мало шансов, что локальная ссылка в родительском классе переопределяется в производном классе. таким образом, « делает ваши подклассы свободными переопределить любой метод, не нарушая других ».

Если ваш класс не будет унаследован, или переопределение метода ничего не сломает, вам просто не нужно __double_leading_underscore .

Answer #12

Получение фактов _ и __ довольно легко; другие ответы выражают их довольно хорошо. Использование намного сложнее определить.

Вот как я это вижу:

Следует использовать для указания, что функция не предназначена для публичного использования, например, для API. Это и ограничение на импорт делают его похожим на internal в c #.

Мастер Йода рекомендует:  15 скриптов таймера обратного отсчёта на jQuery и CSS3

Следует использовать, чтобы избежать столкновения имен в иерархии inheritace и избежать позднего перехвата. Очень похоже на c #.

Если вы хотите указать, что что-то не для общественного использования, но оно должно действовать как protected использование _ . Если вы хотите указать, что что-то не для общественного использования, но оно должно действовать как private использование __ .

Это также цитата, которую мне очень нравится:

Проблема в том, что автор класса может законно подумать: «это имя атрибута / метода должно быть закрытым, доступным только из этого определения класса» и использовать соглашение __private. Но в дальнейшем пользователь этого класса может сделать подкласс, который законно нуждается в доступе к этому имени. Поэтому либо надкласс должен быть изменен (что может быть сложно или невозможно), либо код подкласса должен использовать вручную искаженные имена (что в лучшем случае является уродливым и хрупким).

Но проблема с этим на мой взгляд заключается в том, что если нет IDE, которая предупреждает вас о том, что вы переопределяете методы, поиск ошибки может занять некоторое время, если вы случайно завершили метод из базового класса.

Какова цель одной переменной подчеркивания «» в Python?

что означает _ после for в этом коде?

4 ответа:

_ имеет 3 основных обычных использования в Python:

  1. для хранения результата последнего выполненного выражения (/statement) в интерактивном режиме сеанс переводчика. Этот прецедент был установлен стандартом CPython переводчик и другие переводчики последовали его примеру
  2. для поиска перевода в i18n (см. gettext документация, например), как в коде, например: raise forms.ValidationError(_(«Please enter a correct username»))
  3. как имя переменной общего назначения «выбрасывание» указывают на то, что часть результат функции намеренно игнорируется, как в коде типа: label, has_label, _ = text.partition(‘:’)

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

Это просто имя переменной, и это обычно в python использовать _ для одноразовых переменных. Это просто означает, что переменная цикла не используется.

подчеркивание _ рассматривается как «мне все равно» или «одноразовая» переменная в Python

интерпретатор python сохраняет последнее значение выражения в специальной переменной с именем _ .

подчеркивание _ также используется для игнорирования определенных значений. Если вам не нужны конкретные значения или значения не используются, просто присвоить значения подчеркивать.

игнорировать значение при распаковке

есть 5 случаев для использования подчеркивания в Python.

для хранения значения последнего выражения в интерпретаторе.

для игнорирования конкретных значений. (так называемое «мне все равно»)

для придания специальных значений и функций имени переменных или функций.

использовать в качестве функций’ интернационализация(i18n) ‘или’ локализация(l10n)’.

To разделите цифры числового литерального значения.

здесь хорошая статья с примерами по mingrammer.

Какова цель одной переменной подчеркивания «» в Python?

что означает _ после for в этом коде?

4 ответа:

_ имеет 3 основных обычных использования в Python:

  1. для хранения результата последнего выполненного выражения (/statement) в интерактивном режиме сеанс переводчика. Этот прецедент был установлен стандартом CPython переводчик и другие переводчики последовали его примеру
  2. для поиска перевода в i18n (см. gettext документация, например), как в коде, например: raise forms.ValidationError(_(«Please enter a correct username»))
  3. как имя переменной общего назначения «выбрасывание» указывают на то, что часть результат функции намеренно игнорируется, как в коде типа: label, has_label, _ = text.partition(‘:’)

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

Это просто имя переменной, и это обычно в python использовать _ для одноразовых переменных. Это просто означает, что переменная цикла не используется.

подчеркивание _ рассматривается как «мне все равно» или «одноразовая» переменная в Python

интерпретатор python сохраняет последнее значение выражения в специальной переменной с именем _ .

подчеркивание _ также используется для игнорирования определенных значений. Если вам не нужны конкретные значения или значения не используются, просто присвоить значения подчеркивать.

игнорировать значение при распаковке

есть 5 случаев для использования подчеркивания в Python.

для хранения значения последнего выражения в интерпретаторе.

для игнорирования конкретных значений. (так называемое «мне все равно»)

для придания специальных значений и функций имени переменных или функций.

использовать в качестве функций’ интернационализация(i18n) ‘или’ локализация(l10n)’.

To разделите цифры числового литерального значения.

здесь хорошая статья с примерами по mingrammer.

Какова цель единственной подчеркивания «_» в Python?

Каково значение _ после for в этом коде?

4 ответа

_ имеет 3 основных традиционных использования в Python:

  1. Чтобы сохранить результат последнего выполненного выражения (/ оператор) в сеансе интерактивного интерпретатора. Этот прецедент был установлен стандартным интерпретатором CPython, и другие интерпретаторы последовали его примеру
  2. Для поиска перевода в i18n (см., Например, документацию gettext), как в коде: raise forms.ValidationError(_(«Please enter a correct username»))
  3. В качестве универсального имени переменной «throwaway», чтобы указать, что часть результата функции намеренно игнорируется, как в коде, подобном следующему: label, has_label, _ = text.partition(‘:’)

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

Попытка понять цикл Python с использованием подчеркивания и ввода

Еще один совет — если кто-то изучает Python на HackerRank, зная, что это важно для начала.

Я пытаюсь понять этот код:

Я ставлю 2 как первый исходный вход. Как функция знает, что я только дважды зацикливаюсь? Это отбрасывает меня, потому что это не типичный. для я в xrange (0,2).

Сначала я думал, что подчеркивание повторяет последнюю команду в оболочке. Поэтому я добавил операторы печати в код, чтобы увидеть значение подчеркивания. но значения просто показывают 0 и 1, как и типичная структура цикла.

Я прочитал этот пост уже, и я все еще не могу понять, какой из этих трех применений подчеркивания используется.

Я только начинаю изучать Python, поэтому очень легкие объяснения будут высоко оценены!

ncoghlan answer отображает 3 обычных использования для _ в Python:

    Чтобы сохранить результат последнего выполненного оператора в интерактивном интерпретатор. Этот прецедент был установлен стандартным CPython переводчик и другие переводчики последовали этому примеру.

Для поиска перевода в i18n (импортируется из соответствующего C условностей, я считаю), как в коде вроде:

Как общее имя переменной «throwaway», чтобы указать, что часть результата функции умышленно игнорируется, как в коде типа:

Вопрос заключается в том, какой из них используется в примере вашего кода. Ответ будет состоять в том, что это переменная (case 3), но ее содержимое печатается здесь для целей отладки.

Однако не общее соглашение Python использует _ как переменную цикла, если ее значение используется каким-либо образом. Таким образом, вы можете регулярно видеть:

где _ немедленно сигнализирует читателю, что значение не важно, и цикл повторяется всего 10 раз.

Однако в коде, например

где используется значение переменной цикла, принято использовать имя переменной, например i , j вместо _ .

Добавить комментарий