2017-11-17 20 views
0

Python 3에서 유형 힌팅을 사용하면 mypy과 같은 타사 도구가 유형을 확인할 수 있습니다. 그러나 형식 검사 구문이 프로그램 주석과 약간 엉망이라는 것을 알았습니다. mypy를 사용하면 스텁 함수와 메소드를 .py 파일과 동일한 디렉토리에있는 .pyi 개의 파일에 넣을 수 있습니다. .py 파일에 해당하는 .pyi 파일의 모든 유형 관련 구문을 정의 할 수 있습니까? 예를 들어 .pyi 파일에서 모든 형식 구문을 사용하여 변수, 메서드, 반환 형식 등을 정의 할 수 있지만 기본 코드는 .py 인 채로 둡니다.Python의 모든 유형 힌트/검사 인프라를 .pyi 파일로 분리 할 수 ​​있습니까?

답변

1

아니요. PEP 484는 사용자의 이익을 위해 기존 모듈의 "공용 인터페이스"역할을하는 사용자 정의 pyi 파일을 만들 수 있다고 명시하지만 PyI 파일을 가져 오는 방법은 지정하지 않으며 내부적으로 해당 py 파일을 typecheck 확인하십시오.

실제로 디렉터리에 py 파일과 pyi 파일이 모두 포함되어 있으면 py 파일은 완전히 무시됩니다.

mypy issue tracker에 대한 공개 기능 요청이 있지만 우선 순위가 낮은 종류의 작업 인 것 같습니다. 해당 기능이 구현 되더라도 궁극적으로는 Python 유형의 하위 집합 만 사용할 수 있기 때문입니다. 체계. 우리는 실제로 우리가 건설 팬텀 newtypes를 호출 할 필요가 않기 때문에

from pathlib import Path 
from typing import NewType 

UnsanitizedText = NewType('UnsanitizedText', str) 
CleanHtml = NewType('CleanHtml', str) 
HtmlTemplate = NewType('HtmlTemplate', str) 

def get_user_input() -> UnsanitizedText: 
    # code omitted 

def escape_to_html(raw: UnsanitizedText) -> CleanHtml: 
    # perform checks on 'raw', do escaping logic, etc 
    return CleanHtml(cleaned_string) 

def load_template(path: Path) -> HtmlTemplate: 
    return HtmlTemplate(path.read_text()) 

def render_template(template: HtmlTemplate, *kwargs: CleanHtml) -> CleanHtml: 
    # code omitted 

t = load_template(Path("foo/bar.html")) 
dirty = get_user_input() 
clean = escape_to_html(dirty) 

print(render_template(t, arg=dirty)) # Does not typecheck 
print(render_template(t, arg=clean)) # Typechecks 

/혼합이 어울려 할 수 있습니다

예를 들어, 우리는 템플릿 HTML 또는 무언가에 대한 몇 가지 코드를 작성 NewType 같은 것을 사용하고 싶었 가정 phantom이 정규 표현식 내에서 호출 할 때,이 모듈을 스텁으로 표현하는 방법이 불분명합니다. 등

+0

감사 것들 캐스트 같은 NamedTuple, TypedDict -

는 스텁에 표현하기 어려울 것 몇 가지 다른 입력 기능이 있습니다. 나는 엄격한 유형 검사를 피할 것입니다. 구문은 나에게 너무 시각적으로 너무 복잡합니다. 특히 복합 데이터 유형을 가져오고 반환하는 함수 및 Python 3.6 이전에 변수 유형을 지정하기 위해 주석을 사용해야하는 필요성이 있습니다. 어쩌면 나는 그것을 미래에 다시 살펴볼 것이다. – Sean