Причина присвоения "_"

Я видел это в нескольких контекстах, например,

после распаковки:

_, 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() вернет одно значение, и вы не можете назначить его двум переменным, а также нецелесообразно назначать значения _, которые имеют особое значение.