type specify parameter force checking python python-3.5 type-hinting

python - specify - ¿Cómo puedo crear una sugerencia de tipo de que mi lista devuelta contiene cadenas?



python type checking (1)

Quiero usar sugerencias de tipo en mi programa de Python. ¿Cómo puedo crear sugerencias de tipo para estructuras de datos complejas como

  • listas con cuerdas
  • un generador que devuelve enteros?

Ejemplo

def names() -> list: # I would like to specify that the list contains strings? return [''Amelie'', ''John'', ''Carmen''] def numbers(): # Which type should I specify for `numbers()`? for num in range(100): yield num


Utilice el módulo de typing ; contiene genéricos , objetos tipo que puede usar para especificar contenedores con restricciones en su contenido:

import typing def names() -> typing.List[str]: # list object with strings return [''Amelie'', ''John'', ''Carmen''] def numbers() -> typing.Iterator[int]: # iterator yielding integers for num in range(100): yield num

Dependiendo de cómo diseñe su código y de cómo quiera usar el valor de retorno de los names() , también podría usar los tipos. types.Sequence y tipos types.MutableSequence Tipos de types.MutableSequence , dependiendo de si espera poder mutar el resultado o no. .

Un generador es un tipo específico de iterador , por lo que typing.Iterator iterador es apropiado aquí. Si su generador también acepta los valores de send() y utiliza el return para establecer un valor de StopIteration , puede usar el objeto typing.Generator también:

def filtered_numbers(filter) -> typing.Generator[int, int, float]: # contrived generator that filters numbers; returns percentage filtered. # first send a limit! matched = 0 limit = yield yield # one more yield to pause after sending for num in range(limit): if filter(num): yield num matched += 1 return (matched / limit) * 100

Si eres nuevo en la sugerencia de tipo, entonces PEP 483: la teoría de las sugerencias de tipo puede ser útil.