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)]
Ответы
Ответ 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, немного сложно найти, куда поместить команду, так как я не смог найти свой исполняемый файл.
В Кодексе ВС;
- нажмите Файл> Настройки> Настройки.
- Прокрутите вниз до "Конфигурации Python" в левом окне.
- прокрутите вниз до "Python Linting: Mypy Args" в правом окне
- нажмите на ссылку "Редактировать в settings.json"
- отредактируйте json, включив в него: "--extension-pkg-whitelist ="
Я должен был сделать все это, потому что PyLint не исполняется из моей командной строки Windows...
Ответ 4
Если вы используете VS Code для Mac, это то, что вам нужно сделать, чтобы отредактировать файл settings.json:
- Нажмите "Код" (т.е. Вкладка "Код Visual Studio" слева от вкладки "Файл") → "Настройки" → "Настройки".
- Прокрутите вниз до Расширения и нажмите на Python в списке.
- Нажмите на любую
Edit in settings.json
. Это открывает файл settings.json
для редактирования. - Добавьте строку
"python.linting.pylintArgs": ["----extension-pkg-whitelist=1xml"]
.