내 유형 힌트에서 함수 유형을 어떻게 지정할 수 있습니까?


137

현재 Python 3.5 프로젝트에서 유형 힌트를 사용하고 싶습니다. 내 함수는 매개 변수로 함수를 받아야합니다.

유형 힌트에서 유형 함수를 어떻게 지정할 수 있습니까?

import typing

def my_function(name:typing.AnyStr, func: typing.Function) -> None:
    # However, typing.Function does not exist.
    # How can I specify the type function for the parameter `func`?

    # do some processing
    pass

PEP 483을 확인 했지만 거기에서 함수 유형 힌트를 찾을 수 없습니다.


21
함수는Callable
jonrsharpe

3
python.org/dev/peps/pep-0483/#fundamental-building-blocks , "we might add"이전의 마지막 글 머리 기호입니다.

답변:


174

@jonrsharpe 가 주석에서 언급했듯이 다음과 같이 할 수 있습니다 typing.Callable.

from typing import AnyStr, Callable

def my_function(name: AnyStr, func: Callable) -> None:

문제는 Callable그 자체로 다음 Callable[..., Any]을 의미합니다.

콜 러블은 여러 / 유형의 인수를 취하고 모든 유형의 값을 반환합니다. 대부분의 경우 거의 모든 함수를 전달할 수 있으므로 원하는 것이 아닙니다. 함수 매개 변수와 반환 유형도 힌트되기를 원합니다.

이것이 많은 typesin typing이 이러한 추가 유형을 나타내는 하위 스크립팅을 지원하도록 오버로드 된 이유 입니다. 예를 들어, sum두 개의 ints를 받고 다음을 반환하는 함수 가 있다면 int:

def sum(a: int, b: int) -> int: return a+b

그것에 대한 주석은 다음과 같습니다.

Callable[[int, int], int]

즉, 매개 변수는 외부 구독의 두 번째 요소로 반환 유형을 사용하여 외부 구독에서 하위 스크립팅됩니다. 일반적으로 :

Callable[[ParamType1, ParamType2, .., ParamTypeN], ReturnType]

26
typing물건은 전체 파이썬 언어를 한 단계 향상시킵니다.
javadba

1
@javadba - 오, 그래,하지만 난 그런데 ...하는 전화에 있는지 아직 모르겠어요 -에 대해 무엇을 Callable[[Arg, Types, Here], ...]위한 *args, **kwargs키워드 전용 인수 및 위치만을 인수? 콜 러블의 타입 시그니처에서 호출 규칙에 대해 생각하지 않았습니까? ;)
Tomasz Gandor

10

주목해야 할 또 다른 흥미로운 점은 내장 함수 type()를 사용하여 내장 함수 의 유형을 가져와 사용할 수 있다는 것입니다. 그래서 당신은 가질 수 있습니다

def f(my_function: type(abs)) -> int:
    return my_function(100)

또는 그 형태의 무언가


유형 힌트는 원하는대로 사용할 수 있지만 항상 게으른 평가가되지는 않았습니다. 또한 귀하의 기능은 실제로 builtin_function_or_methodmy_function? lambda일 하지 않겠습니까 ? 사용자 정의 함수 또는 바인딩 된 메서드?
Tomasz Gandor
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.