Подтвердить что ты не робот

Как подавить предупреждения "неиспользуемые переменные" в Eclipse/PyDev

Как подавить предупреждения "неиспользуемые переменные" в Eclipse/PyDev

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

Если вам интересно, почему я буду делать это намеренно, это просто для удобства чтения. Скажем, функция возвращает кортеж кортежей, несколько частей моего кода могут работать с третьим значением, подобным этому:

label, content = myfunc()[2]

Иногда меня может интересовать только "контент", но я нахожу это...

tmp, content = myfunc()[2]

... чтобы быть более параллельным (и, следовательно, более читаемым), чем это:

content = myfunc()[2][1]

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

>>> myfunc()[2]
('lab', 'val')
>>> , v = myfunc()[2]
SyntaxError: invalid syntax
>>> tmp, v = myfunc()[2]
>>> 
4b9b3361

Ответ 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 не возникает.)

Ответ 2

Добавьте комментарий #@UnusedVariable в конец строки.

Каждое предупреждение в eclipse имеет аналогичный комментарий дезактивации. Используйте Quick Fix, чтобы открыть их (поместите курсор в предупреждение и нажмите Ctrl + 1)

Ответ 3

Настройки → PyDev → Редактор → Анализ кода, вкладка "Неиспользуемые"

Найдите настройку для

Не сообщайте неиспользуемую переменную, если имя начинается с: (разделяется запятой)

а затем используйте один из префиксов в этом списке или добавьте другой префикс.

Например, если у вас есть переменная "tmp" в следующем коде:

tmp, content = myfunc()[2]

и у вас есть "_" в списке префиксов, чтобы игнорировать, а затем преобразовать "tmp" в "_tmp" следующим образом:

_tmp, content = myfunc()[2]

Ваша ошибка исчезнет. Я думаю, что это более читаемое решение, чем просто использование "_", как было предложено @abarnert, а также избегает осложнений, связанных с переводом.

Ответ 4

Я сталкиваюсь с этим несколько раз, когда я использую функцию, аналогичную той, которую вы описываете, когда возвращается кортеж. Вы можете глобально установить уровни предупреждений для анализа кода PyDev в разделе "Настройки → PyDev → Редактор → Анализ кода". В анализе кода на вкладке "Неиспользуемый" существует опция установки уровня предупреждения для "Неиспользованной переменной", а также других случаев.