2016-06-15 15 views
18

Ich möchte Typhinweise in meinem aktuellen Python 3.5-Projekt verwenden. Meine Funktion sollte eine Funktion als Parameter erhalten.Wie kann ich den Funktionstyp in meinen Typhinweisen angeben?

Wie kann ich die Typ-Funktion in meinen Typhinweisen angeben?

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 

Ich habe PEP 483, konnte aber keine Funktion Typ Hinweis dort finden.

+8

Eine Funktion ist [ 'Callable'] (https://www.python.org/dev/peps/pep-0483/#fundamental- Bausteine) – jonrsharpe

+1

https://www.python.org/dev/peps/pep-0483/#fundamental-building-blocks, letzter Punkt vor "wir könnten hinzufügen". – Evert

+1

Oh, wunderbar :) Danke! Bitte schreiben Sie einen kurzen Beitrag - ich werde die Antwort bestätigen. – Jon

Antwort

18

Wie @jonrsharpe bemerkt in einem Kommentar, kann dies mit typing.Callable erfolgen:

from typing import AnyStr, Callable 

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

Ausgabe ist, Callable auf seine eigene ist Callable[..., Any] übersetzt, das heißt:

A aufrufbar nimmt eine beliebige Anzahl von/type of Argumente und gibt einen Wert eines beliebigen Typs zurück. In den meisten Fällen ist dies nicht das, was Sie wollen, da Sie so ziemlich jede Funktion passieren lassen können. Sie möchten, dass auch die Funktionsparameter und Rückgabetypen angezeigt werden.

Deshalb wurden viele types in typing überladen, um Subskripting zu unterstützen, das diese zusätzlichen Typen bezeichnet. Wenn also zum Beispiel hatte eine Funktion, die zwei sumint s nimmt und gibt ein int:

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

Ihre Anmerkung für sie wäre:

Callable[[int, int], int] 

, die ist, sind die Parameter sub- Skript in der äußeren Subskription mit dem Rückgabetyp als zweites Element in der äußeren Subskription. Allgemein gilt:

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

Ein weiterer interessanter Punkt ist zu beachten, dass Sie in der Funktion der eingebauten können type() den Typ einer eingebauten Funktion zu erhalten und diese zu verwenden. So könnten Sie haben

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

oder etwas in der Form