Как скрыть вывод ошибки Pylint 1.2.1 при использовании Django?

Я пытаюсь интегрировать pylint в наш локальный проект, который использует Django (1.6.1), и у меня он работал с Pylint 0.27.0, но теперь, когда я обновился до последней версии 1.2.1, появляются некоторые новые ошибки и Кажется, я не могу заставить их уйти.

Вот характер ошибки:


from django.db import models

class UserData(models.Model):
    # data...
    fieldA  = models.IntegerField(default=0)
    fieldB  = models.IntegerField(default=0)

# ...

x = UserData(fieldA=1, fieldB=2)
# The above line of code generates errors:
# Unexpected keyword argument 'fieldA' in constructor call (unexpected-keyword-arg)
# Unexpected keyword argument 'fieldB' in constructor call (unexpected-keyword-arg)
# No value for argument 'name' in constructor call (no-value-for-parameter)
# No value for argument 'bases' in constructor call (no-value-for-parameter)
# No value for argument 'attrs' in constructor call (no-value-for-parameter)

Я попытался обойти это, отредактировав файл во время проверки pylint, используя что-то вроде этого:

UserData.__init__ = lambda self, *args, **kwargs: None

Но Pylint по-прежнему выдает те же ошибки. Я также пытался напрямую добавить вызов конструктора в объект UserData, но все равно не повезло.

Можно ли каким-либо образом изменить код или настройки pylint, чтобы устранить эти ошибки? Желательно, не скрывая эти ошибки для всего проекта.


person camomilk    schedule 09.06.2014    source источник
comment
Обновление: в настоящее время я могу избежать сообщений об ошибках, запустив скрипт, который изменяет мой файл перед запуском pylint. Но это похоже на больше работы, чем нужно.   -  person camomilk    schedule 10.06.2014


Ответы (2)


Начиная с pylint версии 1.4, эти ошибки больше не генерируются для Django.

person Tzach    schedule 03.12.2014

Вы можете отключить эти ошибки на уровне модуля с помощью добавление определенного правила в комментарии вверху модуля:

# pylint: disable=unexpected-keyword-arg, no-value-for-parameter

from django.db import models

class UserData(models.Model):
    ...

Символические имена ошибок (в отличие от номеров ошибок) можно использовать начиная с версии 0.25.3.


Похоже, что эта конкретная проблема с pylint связана с фиксацией от апреля 2014 года< /а>. На проблему указал рецензент, и существуют других пользователей, которые также пострадали от этого, но похоже, что это еще не исправлено.

По сути, когда pylint анализирует вызываемый вызов, он проверяет различные параметры в зависимости от типа вызываемого объекта. К сожалению, если callable является классом, то он сначала проверяет __new__ (который в некоторых случаях может присутствовать в родительских метаклассах) и, если находит, полностью игнорирует __init__. Вот почему в ошибках, которые вы получаете, упоминаются name, bases, attrs, например. это аргументы __new__.

person voithos    schedule 09.06.2014
comment
Похоже, что размещение этого в файле UserData будет работать при использовании UserData в том же файле, но не в том случае, если UserData импортируется и используется в другом файле. (Спасибо за публикацию, я не знал, что теперь вы можете использовать имена ошибок вместо поиска кодов ошибок!) - person camomilk; 10.06.2014
comment
@camomilk: В качестве еще одного возможного варианта, возможно, вы могли бы поэкспериментировать с использованием плагина pylint_django, который якобы исправляет некоторые предупреждения, которые генерируются из-за того, как Django динамически генерирует некоторые атрибуты объекта (хотя я не смог найти конкретного упоминания об ошибках, которые вы получаете). - person voithos; 10.06.2014
comment
Я попробовал pylint_django, но он не устранил эту ошибку. Я предполагаю, что это было сделано для более ранней версии pylint, я думаю, что эта ошибка новая в pylint 1.2.1 (по крайней мере, для конструкторов). - person camomilk; 10.06.2014
comment
@camomilk: Я считаю, что вы правы - я внес изменения с дополнительной информацией, которую я нашел. Похоже, это известная ошибка в pylint. - person voithos; 10.06.2014