¿Cómo saber el tipo de retorno de la función y los tipos de argumentos?

| | | | | | | | | | | | | | |

Aunque soy consciente del concepto de tipificación pato de Python, a veces tengo problemas con el tipo de argumentos de las funciones o el tipo del valor de retorno de la función.

Ahora, si escribiera la función yo mismo, SÍ conozco los tipos. Pero, ¿qué pasa si alguien quiere usar y llamar a mis funciones? ¿Cómo se espera que conozca los tipos? Por lo general, coloco información de tipo en la cadena de documentación de la función (como: "... el argumento id debe ser un número entero..." y "... la función devolverá un ( cadena, [entero]) tupla.")

Pero, ¿buscar la información en la cadena de documentos (y ponerla allí, como codificador) es realmente la forma en que se supone que debe hacerse?

Editar: Si bien la mayoría de las respuestas parecen dirigirse hacia "¡sí, documento!", creo que esto no siempre es muy fácil para los tipos "complejos".
Por ejemplo : ¿cómo describir concisamente en una cadena de documentación que una función devuelve una lista de tuplas, con cada tupla de la forma (node_id, node_name, uptime_minutes) y que los elementos son respectivamente una cadena, una cadena y un número entero?
La documentación de docstring PEP no da ninguna guía al respecto.
Supongo que el contraargumento será que en ese caso se deben usar clases, pero encuentro que Python es muy flexible porque permite pasar estas cosas usando listas y tuplas, es decir sin clases.