Ответ 1
Если вам не нужно значение переменной, назначьте его специальной переменной _
.
Что касается Python, то в _
нет ничего особенного; это просто другое имя юридического идентификатора, как и любое другое.
Однако для большинства инструментов "lint" -типов (надеюсь, включая PyDev), и, что более важно, для читателей-людей, у него есть особое значение: "Мне не нужна эта переменная, я только что-то помещаю здесь, потому что API/синтаксис/что-то требует этого". Это означает, что они не будут предупреждать вас о том, что вы его не используете.
Итак:
_, content = myfunc()[2]
И да, вы правы, что это часто более читаемо, чем myfunc()[2][1]
. Не только это, но и помогает вам уловить еще несколько ошибок, если myfunc()[2]
не имеет ровно двух членов, назначение кортежа будет выбрано, но [1]
не будет.
Очень, очень редко, это не очень хорошая идея, потому что ценность - это то, что вы хотите как можно скорее собрать мусор, и привязать его к _
вместо того, чтобы просто не привязывать его вообще (например, через [2][1]
) задерживает это.
Более серьезно, это противоречит другой идиоме, которая также использует специальное использование _
: Код, который использует gettext
для интернационализации, обычно делает:
import gettext
_ = gettext.gettext
Или, что эквивалентно:
from gettext import gettext as _
Очевидно, вы не можете использовать _
как ярлык gettext, так и бессмысленный идентификатор. (Вы могли бы с этим справиться, потому что значение gettext
связано с модульным глобальным уровнем, а бессмысленный идентификатор должен использоваться только внутри тела функций... но все же, это очень плохая идея попробовать, потому что в какой-то момент вы в конечном итоге используете gettext
_
в функции после того, как вы назначили локальное значение, которое его тенью.) Ничто не заставило вас использовать _
в любом случае, но если вы используете что-либо еще, вы, вероятно, чтобы запутать читателей (и, возможно, тот же инструмент, который вы хотите умиротворить в первую очередь). Итак, вы должны решить, какой из них важнее для вас в любом проекте. (И обычно, если вы используете gettext
, это будет более важным.)
Если вы повторно вызываете myfunc
и удаляете некоторые из значений, вам может потребоваться написать функцию обертки:
def mywrapperfunc():
_, content = myfunc()[2]
return content
Тогда ваш код может просто сделать:
content = mywrapperfunc()
Это имеет ряд преимуществ:
- Это, очевидно, легче читать, чем что-либо, что требует, чтобы вы помнили, что хотите вторую половину кортежа, которая находится в индексе 2 последовательности, возвращаемой
myfunc
. - Это дает вам место, чтобы добавить приятное имя (надеюсь, лучше, чем
mywrapperfunc
) и/или комментарии /docstrings, если это не тривиально. - Это означает, что если вы позже измените
myfunc
, значит, значение, которое вы хотите, теперь находится в индексе 3 вместо 2, а второй член 3-элементного кортежа вместо 2-элементного кортежа, вам нужно только изменитьmywrapperfunc
вместо 20 разных строк кода. - Это также означает, что если вы позже захотите использовать конфликтующую
_
идиому (например, чтобы i18n ваш код сgettext
), вам нужно только изменить его в одном месте.
Односторонняя заметка: в интерактивном интерпретаторе _
имеет особое значение: он связан с результатом последней интерактивной команды. Но это не значит, что вы не можете использовать _
в интерактивном интерпретаторе. (На самом деле, это еще лучше, потому что все, что вы там, тут же перезаписывается, поэтому очень редкая проблема с GC не возникает.)