2016-09-08 4 views
3

LXML 라이브러리를 사용하여 XML을 구문 분석하는 일부 코드에서 mypy을 사용하여 형식 검사를 수행하려고합니다.mypy 가짜 오류 : "모듈"에 etree가있는 "XPath"속성이 없습니다

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 기능이 존재한다는 힌트를 얻고 싶습니다. 독자적으로 알아낼 수없는 것처럼 보입니다.

분명히 말하자면, mypylxml 라이브러리에서 나오는 구조에 대해 올바른 유형을 알고 있다는 사실을 실제로 신경 쓰지 않습니다. 필자는 자신의 클래스에 타입 정보를 넣는 것에 대해 더 신경을 썼다. 구문 분석 된 정보를 밀어 넣기 때문에 형식 확인 함수가 필요하다. etree.XPath을 사용하여 쿼리를 수행하고 데이터를 찾은 다음 유형을 입력한다. 내 스크립트 내에서 정의 된 주석 처리 된 클래스.

mypy 내가 현재이가 인 것 같습니다 mypy 0.4.4

답변

3

을 사용하고 etree.parse

에 내 전화로 괜찮 예를 들어, etree에 다른 기능에 어려움이하지 않는 것 버그 typeshed, 커뮤니티에서 제공 한 stdlib 및 다양한 타사 라이브러리에 대한 유형 주석 모음.

특히, stubs for lxml에 XPath에 대한 정의가 완전히 누락 된 것처럼 보입니다. 이것은 아마도 감독입니다. 문제 추적기에 버그를 제출하거나 수정 사항이 포함 된 요청을 제출하려고합니다.

mypy가 최신 버전의 typeshed로 다시 동기화되면에서 mypy를 설치해야합니다 (적어도 10 월 중에 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 내의 어떤 것도 타입을 무시하게 만들 것이라고 잘못 추측 했었지만 그렇지 않습니다. 두 번째 제안에 필요한 유형 주석을 작성하거나 typeshed에 대한 패치를 제안하는 데는 충분하지 않지만 [버그] (https://github.com/python/typeshed/issues/525)를 제출했습니다. 그곳에 – uglycoyote