Есть ли средство проверки синтаксиса python, которое может игнорировать «назначено, но никогда не используется», когда присутствует locals ()?

допустим у меня есть код

def foo():
    bar = 1
    wibble = 3
    return locals()

моя текущая программа проверки синтаксиса (flake8 с syntastic.vim) выдаст ошибку «назначено, но никогда не использовалось» для обеих переменных. Однако locals() подразумевает, что они действительно используются, если не явно.

def foo():
    bar = 1
    wibble = 3 # <-- I still want this to throw as it is definitely not being used
    return bar

Есть ли какая-либо программа проверки python или пользовательские настройки, которые будут осведомлены о locals () и снисходительны?

РЕДАКТИРОВАТЬ:

Это быстрое и грязное решение для vim/syntastic/flake8, которое подавляет предупреждение в вашем .vimrc.

"Ignore unused variable warnings whenever locals() is being used in a file                                                              
function! LocalsWarningSuppress()                                              
    if ( search("locals()",'nw') > 0)                                          
        let g:syntastic_python_checker='flake8 --ignore=W806'                  
    else                                                                       
        let g:syntastic_python_checker='flake8'                                
    endif                                                                      
endfunction 

au BufWritePre **/(filter_pattern)*py call LocalsWarningSuppress()                 

person michael    schedule 16.01.2013    source источник
comment
Возвращение locals() — не такая уж и хорошая идея, ну да ладно.. :-)   -  person Martijn Pieters    schedule 16.01.2013
comment
Мартин: Да, я согласен, что это может быть плохая модель, но при некоторых обстоятельствах она может быть полезна для краткости. Пожалуйста, предположим, что я поддерживаю чужой код :-)   -  person michael    schedule 16.01.2013
comment
Затем просто замените это на return {'bar': bar, 'wibble': wibble} и покончите с этим. pyflakes счастлив, вы счастливы как сопровождающий!   -  person Martijn Pieters    schedule 16.01.2013
comment
Если нет реального решения, я напишу фильтр в самом синтатике, но это будет просто грубая вещь «есть ли локальные () в следующих n строках». Я просто хочу подавить предупреждение на данный момент, и это очень выполнимо.   -  person michael    schedule 16.01.2013
comment
Если вы постоянно возвращаете locals(), это может быть признаком того, что вам нужен класс; поскольку может показаться, что ваши методы просто действуют как пространство имен. Преобразование кода в класс и доступ к переменным/свойствам через экземпляр удовлетворит линтер и, вероятно, принесет вам молчаливую молитву благодарности от следующего парня, который должен его поддерживать.   -  person Burhan Khalid    schedule 16.01.2013
comment
Скажите, пожалуйста, что foo не называется так: locals().update(foo()).   -  person PaulMcG    schedule 16.01.2013


Ответы (1)


Нет. Даже pylint, самый мощный и придирчивый линтер Python, о котором я знаю, недостаточно умен. для обнаружения этого случая. Но если бы это было так, он, вероятно, жаловался бы, что вы используете locals() в первую очередь. :)

С другой стороны, в отличие от pyflakes, pylint поддерживает магические комментарии, чтобы игнорировать определенные проблемы. Но я должен предупредить вас, что pylint чрезвычайно требователен (и, следовательно, медленный) из коробки, поэтому вам нужно потратить несколько минут заранее, чтобы сократить его список проверок вплоть до того, что вам действительно нужно.

Есть тикет, закрытый как wontfix для улучшения этого поведения. в конкретном случае форматирования строки. Похоже, что разработчики pylint не хотят реализовывать это как функцию.

person Eevee    schedule 16.01.2013
comment
Спасибо за ссылку на билет. Я посмотрю, как сильно это будет меня беспокоить :) - person michael; 16.01.2013