sourcetip

파이썬 3에서 힌트 생성기를 어떻게 입력합니까?

fileupload 2023. 6. 2. 21:17
반응형

파이썬 3에서 힌트 생성기를 어떻게 입력합니까?

PEP-484에 따라 다음과 같이 제너레이터 기능을 입력할 수 있습니다.

from typing import Generator

def generate() -> Generator[int, None, None]:
    for i in range(10):
        yield i

for i in generate():
    print(i)

그러나 목록 이해는 PyCharm에서 다음과 같은 오류를 제공합니다.

필요한 컬렉션입니다.Iterable' 대신 Generator[int, None, None]를 받았습니다.(⌘F1)

PyCharm이 왜 이것을 오류로 간주하는지 아십니까?


몇 가지 답변을 읽은 후 몇 가지 설명. 2016 버전를 사용하고 , 『PyCharm Community Edition 2016.3.2(PyCharm Community Edition 2016.3.2)』를 .typing.Generator(코드에 포함됨).위의 코드는 정상적으로 실행되지만 PyCharm은 이를 오류로 간주합니다.

여기에 이미지 설명 입력

그래서 저는 이것이 실제로 PyCharm의 오류인지 아니면 지원되지 않는 기능인지 궁금합니다.

은 다을가합다니를 .typing문서에 따라:

인 네릭형생성함기수반의환달형주수다로 주석을 달 수 .Generator[yield_type, send_type, return_type]모듈 제공

대신 다음 방법을 사용하십시오.

from typing import Generator


def generate() -> Generator[int, None, None]:
    for i in range(10):
        yield i

위에서 원하는 결과를 얻을 수 있습니다.

l = [i for i in generate()]

출력:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]


댓글에 지적된 것처럼, 당신은 PyCharm의 마지막 버전을 사용하지 않을 수 있습니다.2016.3.2 버전으로 전환해 보십시오.안타깝게도 이것은 @Ashwini Chaudhary 댓글에 따르면 잘 알려진 버그입니다.

또한 보고된 이슈(PyCharm의 마지막 버전에 대한)는 작년 12월에 제출되었습니다.그들은 아마 그것을 고치고 같은 버전으로 수정을 밀어 넣었을 것입니다.

이것이 질문에 대한 직접적인 대답은 아니지만, 저는 이것이 더 나은 해결책이라고 생각합니다.

아의타이사사있습다니고를 사용하고 .Iterator[int]Generator(제너레이터 대신)유효성 검사는 정상입니다.저는 그것이 훨씬 더 명확하다고 생각합니다.코드 의도를 더 잘 설명하고 Python 문서에서 권장합니다.

from typing import Iterator

def generate() -> Iterator[int]:
    for i in range(10):
        yield i

목록 또는 다른 반복 가능한 항목에 대해 제너레이터를 변경하는 경우에도 향후 리팩터링을 사용할 수 있습니다.

타이핑 유효성 검사를 위해 PyLance와 함께 Visual Studio Code를 사용하고 있습니다.PyCharm mypy도 같은 동작을 해야 합니다.

Python 3.10 이상을 사용하는 경우 위의 가져오기 명령을 다음으로 변경합니다.

from collections.abc import Iterator

Iterator,Generator그리고.Iterable 정보이 다르므로 하는 것이 것을 하는 데 이 될 수 .

  • Iterator반복기 프로토콜을 구현하는 개체입니다.

  • Generator함수가 다음을 반환한다는 것을 나타낼 뿐만 아니라 보다 구체적입니다.Iterator그러나 그것은 또한 발전기를 사용하여 구현된다 (즉, 사용하는 함수).yield). 제너레이터 함수는 반복기를 반환합니다.

  • 마침내.Iterable그것은 훨씬 더 일반적입니다.Iterator~하듯이Iterable목록 또는 튜플(및 반복기)을 포함하는 반복할 수 있는 개체일 수 있습니다.

따라서 힌트를 입력하는 방법은 주로 코드가 실제로 수행하는 작업에 따라 달라집니다.제가 쓰겠습니다.Iterable함수가 정확한 반복기 유형을 지정하지 않고 반복할 수 있는 개체를 반환함을 나타냅니다.제가 쓰겠습니다.Iterator정확하게 어떤 유형의 반복기인지 지정하지 않고 반복기를 반환하는 함수의 경우.list하지만 그럴 수도 있습니다.Generator) 그리고 마지막으로 사용합니다.Generator함수가 제너레이터를 반환하고 제너레이터로 보내거나 제너레이터에서 반환할 수 있는 값의 유형을 명시적으로 지정합니다.

언급URL : https://stackoverflow.com/questions/42531143/how-to-type-hint-a-generator-in-python-3

반응형