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

Pylint 1.4 сообщает E1101 (без членов) на всех расширениях C

Мы были давними поклонниками pylint. Его статический анализ стал важной частью всех наших проектов python и сэкономил массу времени, преследуя непонятные ошибки. Но после обновления от 1.3 → 1.4 почти все скомпилированные c-расширения приводят к ошибкам E1101 (без членов).

Проекты, которые ранее выполнялись совершенно чистыми с помощью pylint 1.3, теперь жалуются почти на каждый член расширения C с E1101. Мы были вынуждены отключить ошибки E1101, но это существенно умаляет полезность pylint.

Например, это совершенно правильное использование пакета lxml

r"""valid.py: demonstrate pylint 1.4 error"""
from lxml import etree
print etree.Element('mydoc')

Запустите это через pylint, и он сообщает:

$ pylint -rn valid.py
No config file found, using default configuration
************* Module valid
E:  3, 6: Module 'lxml.etree' has no 'Element' member (no-member)

Но это совершенно верно:

$ python valid.py
<Element mydoc at 7fddf67b1ba8>

Здесь, где он становится действительно странным. Очень небольшая часть расширений C, похоже, работает только через pylint, например:

r"""valid2.py: this one works fine"""
import sqlite3
print sqlite3.version

$ pylint -rn valid2.py
No config file found, using default configuration

Мой вопрос в том, кто-нибудь еще видел это? И если да, согласитесь ли вы поделиться своим обходом/решением?

Мы экспериментировали с попыткой создания плагинов для подавления этих предупреждений (http://docs.pylint.org/plugins.html#enter-plugin), но у нас возникают трудности с созданием головок или хвостов документов, а базовый класс astroid является uber-комплексом, и он нарушил наши пытается его проверить.

Для реальных бонусных очков (и нашей вечной благодарности) мы хотели бы понять, что изменилось в pylint. Мы будем рады исправить код (или, по крайней мере, опубликовать документ с лучшей практикой для авторов C-расширения), который удовлетворяет требованиям pylint.

Сведения о платформе

$ pylint --version
No config file found, using default configuration
pylint 1.4.0,
astroid 1.3.2, common 0.63.2
Python 2.7.5 (default, Jul  1 2013, 18:09:11)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-3)]
4b9b3361

Ответ 1

Вскоре после публикации моего вопроса я нашел ответ. Фактически это изменение было сделано специально в качестве меры безопасности. Pylint импортирует модули для эффективного определения действительных методов и атрибутов. Было решено, что импорт c-расширений, которые не являются частью python stdlib, представляет собой угрозу безопасности и может вносить вредоносный код.

Это было сделано в выпуске Astroid 1.3.1 https://mail.python.org/pipermail/code-quality/2014-November/000394.html

Только C-расширения из надежных источников (стандартная библиотека) загружен в исследуемый процесс Python, чтобы построить AST из живого модуль.

Существует четыре решения, если вы хотите использовать pylint для проектов, которые импортируют расширения non-stdlib c.

1) Отключите безопасность, используя опцию командной строки --unsafe-load-any-extension=y. Эта функция недокументирована и классифицируется как скрытая опция (https://mail.python.org/pipermail/code-quality/2014-November/000439.html).

2) Отключите безопасность, используя настройку pylint.rc unsafe-load-any-extensions=yes. Это рекомендуется по варианту 1 и включает полную документацию в файл pylint.rc по умолчанию (созданный с помощью --generate-rcfile).

3) В частности, список имен пакетов или модулей, которым вы доверяете, должен быть загружен pylint в файле pylint.rc с помощью параметра extension-pkg-whitelist=.

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

Мы выбрали вариант 3. Мы добавили следующую строку в наш проект pylint.rc file:

extension-pkg-whitelist=lxml

Ответ 2

@user590028, большое спасибо за ваш ответ! Я просто столкнулся с этой проблемой с библиотеками win32api, win32evtlog, win32file, win32gui и win32process, и ваше решение сработало.

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

pylint --extension-pkg-whitelist=win32api,win32evtlog,win32file,win32gui,win32process myfile.py

Ответ 3

Для тех из вас, кто использует VS Code, немного сложно найти, куда поместить команду, так как я не смог найти свой исполняемый файл.

В Кодексе ВС;

  1. нажмите Файл> Настройки> Настройки.
  2. Прокрутите вниз до "Конфигурации Python" в левом окне.
  3. прокрутите вниз до "Python Linting: Mypy Args" в правом окне
  4. нажмите на ссылку "Редактировать в settings.json"
  5. отредактируйте json, включив в него: "--extension-pkg-whitelist ="

Я должен был сделать все это, потому что PyLint не исполняется из моей командной строки Windows...

Ответ 4

Если вы используете VS Code для Mac, это то, что вам нужно сделать, чтобы отредактировать файл settings.json:

  1. Нажмите "Код" (т.е. Вкладка "Код Visual Studio" слева от вкладки "Файл") → "Настройки" → "Настройки".
  2. Прокрутите вниз до Расширения и нажмите на Python в списке.
  3. Нажмите на любую Edit in settings.json. Это открывает файл settings.json для редактирования.
  4. Добавьте строку "python.linting.pylintArgs": ["----extension-pkg-whitelist=1xml"].