2016-06-15 13 views
18

Voglio usare i suggerimenti tipo nel mio attuale progetto Python 3.5. La mia funzione dovrebbe ricevere una funzione come parametro.Come posso specificare il tipo di funzione nei miei suggerimenti tipo?

Come è possibile specificare la funzione di tipo nei miei suggerimenti tipo?

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 

ho controllato PEP 483, ma non riusciva a trovare un tipo di funzione di suggerimento lì.

+8

Una funzione è [ 'Callable'] (https://www.python.org/dev/peps/pep-0483/#fundamental- blocchi di costruzione) – jonrsharpe

+1

https://www.python.org/dev/peps/pep-0483/#fundamental-building-blocks, ultimo punto elenco prima "potremmo aggiungere". – Evert

+1

Oh, meraviglioso :) Grazie! Si prega di scrivere un breve post - Sto andando a confermare la risposta. – Jon

risposta

18

Come @jonrsharpe osservato in un commento, questo può essere fatto con typing.Callable:

from typing import AnyStr, Callable 

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

problema è, Callable su di essa la propria è tradotto per Callable[..., Any] che significa:

Un callable prende qualsiasi numero di/type of argomenti e restituisce un valore di qualsiasi tipo. Nella maggior parte dei casi, questo non è quello che vuoi dato che ti permetterà praticamente di passare qualsiasi funzione. Volete anche i parametri della funzione e i tipi di ritorno.

Ecco perché molti types in typing sono stati sovraccaricati per supportare il sub-scripting che denota questi tipi aggiuntivi. Quindi se, per esempio, si ha una funzione che prende due sumint s e restituisce un int:

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

l'annotazione perché sarebbe:

Callable[[int, int], int] 

che è, i parametri sono sotto- script nella sottoscrizione esterna con il tipo restituito come secondo elemento nell'abbonamento esterno. In generale:

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

Un altro punto interessante da notare è che è possibile utilizzare il costruito in funzione type() per ottenere il tipo di un costruito in funzione e l'uso che. Così si potrebbe avere

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

O qualcosa di quella forma

Problemi correlati