Причина присвоения "_"
Я видел это в нескольких контекстах, например,
после распаковки:
_, x = L.pop() # e.g., L is a list of tuples
для инициализации контейнера:
X = _
Таким образом, очевидно, что это не элемент формального синтаксиса python, а скорее использования, о котором я знаю, кажутся дискреционными.
Итак, мне любопытно, какова вероятная причина его использования и каковы преимущества в целом (если есть)?
Примечание: мой вопрос относится к использованию "_" в скриптах, модулях и т.д., но не его использование в интерактивном приглашении. В IDLE интерактивный интерпретатор, упакованный с помощью python, а также в ipython, "_", используется в качестве заполнителя для последнего возвращенного результата).
Ответы
Ответ 1
Я видел, как он использовался двумя способами. И как переменная выброса, но чаще всего как текстовая оболочка для интернационализации.
Отбрасываемая переменная
name, _ = 'bida.bombu.foo'.split('.', 1)
Хотя я бы не рекомендовал этого. Назовите его "проигнорировано".
name, ignored = 'bida.bombu.foo'.split('.', 1)
Это яснее.
обертка i18n
from zope.i18nmessageid import MessageFactory
_ = MessageFactory('my.domain')
label = _("The label text")
label
здесь будет "Message", объект, который имеет идентификатор сообщения и домен, и при визуализации в пользовательский интерфейс (например, веб-страницу) он будет переведен на текущий язык пользователя посредством сообщения каталог, чтобы метка попала на локальный язык пользователя.
_
используется здесь, потому что он короткий и ненавязчивый. Полученный код _("The label text")
не отличается от строки, а MyDomainMessage("The label text")
выглядит совсем по-другому, а также намного длиннее.
Ответ 2
Преимущества заключаются в том, что это один символ и он "безымянный".
Недостатком является то, что он часто используется для I18N в качестве ссылки на gettext.gettext()
.
Ответ 3
_
- несколько специальное имя переменной. В оболочке он содержит значение ранее оцененного выражения:
>>> 1+2
3
>>> _+4
7
Внутри скриптов он обычно используется как переменная throwaway, т.е. е. тот, который необходим по семантическим причинам, но это не будет использоваться позже. Синтаксически это просто переменная, как и любая другая.
Ответ 4
Я видел переменную _
, используемую, когда вам не важно, какое значение она получит, более или менее как переменная /dev/null
.
В python философия читаемость гораздо более ценится, чем на других языках, и, например:
x, y, _, w = getPoint()
является компактным и более читаемым, чем другие альтернативы, показывая, что вы не заботитесь о координате z
результата. Другие виды использования могут быть
for _ in xrange(10):
print "Hello, world."
или
def matrix(rows, columns):
return [[0] * columns for _ in xrange(rows)]
Для языка действительно _
является допустимым идентификатором, как и любой другой, даже если в некоторых интерактивных петлях python он имеет особое значение.
Это использование как "анонимная переменная" не очень часто, но все еще существует, поэтому вы можете найти его в существующем коде. Например PyChecker ничего не сообщит о функции matrix
выше, но будет жаловаться, если вы используете "нормальное" имя переменной.
Существуют также пакеты, которые, однако, дают _
четко определенное значение (gettext).
Ответ 5
В сценариях нет веских причин использовать _
. Используя интерактивный интерпретатор, если вы выполняете математический расчет, и хотите получить результат предыдущего выражения, вы можете использовать _
. Учебник Python представляет _
в том же контексте. Я вижу, что поведение переносится из определенных оболочек.
В вашем примере:
_, x = L.pop()
не удастся, потому что L.pop() вернет одно значение, и вы не можете назначить его двум переменным, а также нецелесообразно назначать значения _
, которые имеют особое значение.