Как подавить предупреждения о неиспользуемых переменных в 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]
>>> 

person Jon Coombs    schedule 19.12.2012    source источник


Ответы (5)


Если вам не нужно значение переменной, присвойте его специальной переменной _.

Что касается Python, на самом деле в _ нет ничего особенного; это просто еще одно официальное имя-идентификатор, как и любое другое.

Однако для большинства инструментов в стиле «lint» (надеюсь, включая PyDev) — и, что более важно, для читателей — это имеет особое значение: «Мне не нужна эта переменная, я помещаю сюда что-то только потому, что API/ синтаксис/все, что требуется". Это означает, что они не будут предупреждать вас о том, что вы не используете его.

So:

_, 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) и/или комментарии/строки документации, если это не тривиально.
  • Это означает, что если вы позже измените myfunc так, чтобы нужное значение теперь находилось в индексе 3 вместо 2, и вторым членом кортежа из 3 элементов вместо кортежа из 2 элементов, вам нужно только изменить mywrapperfunc вместо 20 различных строки кода.
  • Это также означает, что если вы позже захотите использовать конфликтующую идиому _ (например, для i18n вашего кода с gettext), вам нужно будет изменить ее только в одном месте.

Одно примечание: в интерактивном интерпретаторе _ действительно имеет особое значение: оно связано с результатом последней интерактивной команды. Но это не значит, что вы не можете использовать _ в интерактивном интерпретаторе. (На самом деле, там даже лучше, потому что все, что вы там прячете, тут же перезаписывается, поэтому очень редкая проблема GC не возникает.)

person abarnert    schedule 19.12.2012
comment
_ используется gettext, поэтому не всегда может быть хорошим выбором, если ваше приложение является международным. - person John La Rooy; 19.12.2012
comment
@gnibbler: Хороший вопрос. На самом деле _ на самом деле не используется gettext, но идиоматично использовать _ = gettext.gettext или его эквивалент, что почти одно и то же. В любом случае, вы, очевидно, не можете использовать _ в качестве бессмысленного идентификатора, если вы это сделаете. Я обновлю ответ. - person abarnert; 19.12.2012
comment
@abarnert: Спасибо за такое полное объяснение! И теперь, когда sid16rgt направил меня к настраиваемому и информативному диалоговому окну настроек, я вижу, что значения по умолчанию будут игнорировать _ или пустышку или даже _drop, или я могу настроить параметры для чего-то доморощенного, например drop. - person Jon Coombs; 23.12.2012

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

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

public static final String MSG_TO_IGNORE_TYPE_UNUSED_IMPORT = "@UnusedImport";
public static final String MSG_TO_IGNORE_TYPE_UNUSED_WILD_IMPORT = "@UnusedWildImport";
public static final String MSG_TO_IGNORE_TYPE_UNUSED_VARIABLE = "@UnusedVariable";
public static final String MSG_TO_IGNORE_TYPE_UNDEFINED_VARIABLE = "@UndefinedVariable";
public static final String MSG_TO_IGNORE_TYPE_DUPLICATED_SIGNATURE = "@DuplicatedSignature";
public static final String MSG_TO_IGNORE_TYPE_REIMPORT = "@Reimport";
public static final String MSG_TO_IGNORE_TYPE_UNRESOLVED_IMPORT = "@UnresolvedImport";
public static final String MSG_TO_IGNORE_TYPE_NO_SELF = "@NoSelf";
public static final String MSG_TO_IGNORE_TYPE_UNDEFINED_IMPORT_VARIABLE = "@UndefinedVariable";
public static final String MSG_TO_IGNORE_TYPE_UNUSED_PARAMETER = "@UnusedVariable";
public static final String MSG_TO_IGNORE_TYPE_NO_EFFECT_STMT = "@NoEffect";
public static final String MSG_TO_IGNORE_TYPE_INDENTATION_PROBLEM = "@IndentOk";
public static final String MSG_TO_IGNORE_TYPE_ASSIGNMENT_TO_BUILT_IN_SYMBOL = "@ReservedAssignment";
public static final String MSG_TO_IGNORE_TYPE_PEP8 = "@IgnorePep8";
public static final String MSG_TO_IGNORE_TYPE_ARGUMENTS_MISATCH = "@ArgumentMismatch";
person joshua    schedule 29.01.2013
comment
Другие подходы кажутся мне более удобными/прозрачными, но это, безусловно, полезно знать о предупреждениях Eclipse. Спасибо! (+1) - person Jon Coombs; 14.09.2013

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

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

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

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

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

tmp, content = myfunc()[2]

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

_tmp, content = myfunc()[2]

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

person Mark Chackerian    schedule 25.07.2013

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

person sid16rgt    schedule 19.12.2012
comment
Это действительно не очень хорошее решение. Предупреждение есть по уважительной причине. В Python очень легко написать что-то вроде foobra = func(), когда вы имели в виду foobar = func(), поэтому вместо обновления foobar вы в конечном итоге создаете другую переменную. Такая проблема сводит с ума, чтобы преследовать. Но если вы никогда не создаете преднамеренно неиспользуемые имена переменных, линтер может обнаружить эти и подобные проблемы за вас (поскольку они эквивалентны случайному созданию неиспользуемых имен переменных). Поэтому, если вы не имеете дело с большим объемом кода, который нельзя исправить, оставьте предупреждение и исправьте свой код. - person abarnert; 19.12.2012
comment
Я согласен с тем, что типографские ошибки легко создать, и подавление подобных предупреждений имеет свои недостатки. Я часто ловлю себя на том, что расширяю переменные из результатов, чтобы поддерживать другие переменные в состоянии, когда я могу мысленно следить за тем, что я получаю. Иногда я их использую. Иногда нет. По этой причине я оставляю свои предупреждения включенными, но другие, такие как ООП, могут захотеть их отключить. Все, что я хотел сделать, это рассказать, как. - person sid16rgt; 19.12.2012
comment
Спасибо (+1) - различные настройки в Eclipse немного разбросаны, поэтому я не заметил этот раздел в разделе «Окно», «Настройки». В том же диалоговом окне также есть способ отключить предупреждения для определенных имен переменных, что даже лучше, чем временное отключение предупреждений; по умолчанию: фиктивный, _, не используется. - person Jon Coombs; 23.12.2012
comment
Я хотел сказать, что по умолчанию используются имена переменных, начинающиеся с: dummy, _, unused. - person Jon Coombs; 23.12.2012
comment
Это отлично подходит для некоторых случаев, я использую cython и продолжаю получать предупреждения {дубликаты подписи}, очень раздражающие, если бы не это исправление! - person Rabih Kodeih; 23.01.2014

Или вы можете подавить данное предупреждение в Eclipse на любом языке (включая Python) с помощью дополнительного подключаемого модуля. http://suppresswarnings.drupalgardens.com

Также доступны на торговой площадке:

https://marketplace.eclipse.org/content/marker-manager

person Philippe    schedule 29.11.2013