“with”문은 타입 힌트를 지원합니까?


16

with구문으로 정의 된 변수에 대한 유형 힌트를 정의 할 수 있습니까 ?

with example() as x:
    print(x)

위의 힌트를 입력 x하여 str(예를 들어) 라고 말하고 싶습니다 .

내가 찾은 유일한 해결 방법은 중간 변수를 사용하는 것이지만 해키 느낌입니다.

with example() as x:
    y: str = x
    print(y)

타이핑 문서 에서 예제를 찾을 수 없습니다 .


6
유형 검사기가 유형을 x반환 유형으로 추론 할 수 example().__enter__()있습니까?
pschill

2
x반환 유형 인 경우 주석을 달고 싶 example.__enter__습니까? 이상적으로는 해당 방법 / 기능에 주석을 달았습니다.
a_guest

1
xexample; 의 반환 값이 아닙니다 . 의 반환 값입니다 example().__enter__().
chepner

내가 찾은 대부분의 메소드는 반환 값에 대한 유형 힌트를 정의하지 않습니다.
Reactgular

1
@Reactgular 그러면 해결책은 해당 기능에 대한 스텁 파일 을 작성 하여 유형 검사기가 유형을 유추 할 수 있습니다. 일반적으로 내부가 아닌 API 경계에 주석을 답니다. 이 경우 유형의 출처가 분명합니다 example. 주석은 example.__enter__하나의 주석을 의미하지만 접근 방식을 사용하면 컨텍스트 관리자가 사용되는 모든 곳에서 주석을 달아야하며 일반적으로 API가 제공되지 않으면 API의 반환 유형이 무엇인지 어떻게 알 수 있습니까?
a_guest

답변:


11

Python 3.6에서 구현 된 PEP 526을 사용하면 변수에 주석을 달 수 있습니다. 예를 들어

x: str
with example() as x:
    [...]

또는

with example() as x:
    x: str
    [...]

이것은 같은 다른 코드 블록에서도 작동합니다 for. 좋은 답변, 감사합니다.
Reactgular

컨텍스트 관리자가 __enter__메소드가 리턴 할 내용을 암시 x하지 않으면 입력 이 목적을 달성하지 못합니다. mypy모든 유형의 값을 바인딩 할 수 x있습니다.
chepner

@chepner 네 맞아요. PyCharm는 인식 x으로 str두 경우 모두,하지만 mypy하지 않습니다.
pschill

14

일반적으로 유형 주석은 API 경계에 배치됩니다. 이 경우 유형은에서 유추되어야합니다 example.__enter__. 해당 함수가 유형을 선언하지 않으면 해결책은 유형 검사기가 해당 유형을 유추하는 데 도움이되도록 해당 스텁 파일 을 작성하는 것 입니다.

특히 이것은 가져온 .pyi모듈과 동일한 스템을 가진 파일을 작성한다는 의미 Example입니다. 그런 다음 다음 코드를 추가 할 수 있습니다.

class Example:
    def __enter__(self) -> str: ...
    def __exit__(self, exc_type, exc_value, exc_traceback) -> None: ...
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.