2016-09-08 3 views
3

Я пытаюсь использовать mypy для проверки типов в некотором коде, который использует библиотеку LXML для синтаксического анализа XML.mypy spurious error: «module» не имеет атрибута «XPath» с etree

В каждой строке, где я использую etree.XPath, я получаю ложную ошибку от mypy. Например, следующий тривиальный сценарий

from lxml import etree  
NameXPath = etree.XPath("Name/text()") 

генерирует ошибку

test.py:3: error: "module" has no attribute "XPath" 

Но сценарий прекрасно работает и работать мои XPath «ы правильно во время выполнения.

Я также пробовал #type:ignore по импорту, который, как я думал, может сказать mypy, чтобы не набирать проверку этой библиотеки, но это не подавляло ошибок.

from lxml import etree # type:ignore  
NameXPath = etree.XPath("Name/text()") 

я имел некоторый успех в подавлении некоторых ошибок, перемещая вызовы etree.XPath в отдельную функцию, которая не имеет какую-либо аннотации типа, но это, казалось, как взломать и заставил меня устроить свой код неловко.

Я хотел бы знать, есть ли способ полностью подавить эти ложные ошибки или, возможно, намекнуть на то, что функция etree.XPath существует, поскольку она, похоже, не может понять это самостоятельно.

Чтобы быть ясным, мне все равно, что mypy знает правильные типы структур, выходящих из библиотеки lxml. Я больше беспокоюсь о том, чтобы поместить информацию о типе в свои собственные классы, в которые я вставляю анализируемую информацию, поэтому я хочу иметь функции проверки по типу, которые используют etree.XPath для выполнения запросов, поиска данных, а затем вставляют их в тип -annotated классы, которые определены в моем скрипте.

mypy не кажется сложности с другими функциями в etree, например, это нормально с моим призывам etree.parse

настоящее время я использую mypy 0.4.4

ответ

3

Похоже, что это ошибка в typeshed, коллективная коллекция аннотаций типа для stdlib и различных сторонних библиотек.

В частности, похоже, что stubs for lxml отсутствуют описания для XPath полностью. Вероятно, это недосмотр - я попытался бы подавать ошибку на трекер проблемы или попытаться отправить запрос на перенос, содержащий исправление.

После того, как это исправлено, и mypy ресинхронизирует себя с последней версией набора, вам нужно установить mypy с git repo на время (по крайней мере, пока mypy 0.4.5 не появится в октябре).

В то же время, вы можете обойти эту проблему, делая это:

from lxml.etree import XPath # type: ignore 
NameXPath = XPath("Name/text()") 
# mypy considers NameXPath to have a type of Any 

...или, если вы предпочитаете иметь более конкретное определение XPath, сделайте следующее:

import typing 

if typing.TYPE_CHECKING: 
    # typing.TYPE_CHECKING is always False at runtime, so this 
    # branch is parsed by typecheckers only 
    class XPath: 
     # Provide a method header stubs with signatures to fool 
     # mypy into understanding what the interface for XPath is 
else: 
    # Actually executed at runtime 
    from lxml.etree import XPath # type: ignore 

NameXPath = XPath("Name/text()") 
+0

Спасибо. ваше первое предложение использовать «import XPath # type: ignore» работало. Я предположил неправильно, что использование «import etree» #type: ignore заставит его игнорировать типы для чего-либо в пределах etree, но это не так. Я не знаю достаточно, чтобы написать аннотации типа, необходимые для вашего второго предложения, или предложить патч для типов, но я отправил [bug] (https://github.com/python/typeshed/issues/525) на там – uglycoyote

 Смежные вопросы

  • Нет связанных вопросов^_^