La respuesta de @ Paul92 es una buena discusión general, pero me gustaría ofrecer una posible solución limpia (ish) para esto:
Una biblioteca, este código debe ser adaptable a cualquier entorno de tiempo de ejecución, por lo que realmente no puede pedir a STDIN
algunos datos cruciales. Por un lado, es posible que los usuarios de su biblioteca no tengan disponible la entrada estándar por varios motivos. En su lugar, es posible que desee utilizar algún tipo de patrón de estrategia para personalizar cómo se recuperará el token.
En Python, probablemente la mejor opción es pasar la estrategia de búsqueda de tokens como parámetro de función. Algo así:
def stdin_prompt():
return input("Enter code: ")
def my_library_function(arg1, arg2, ... argn, token_provider = stdin_prompt):
...
token = token_provider()
...
return stuff
# somewhere in the user code
stuff = my_library_function(a1, a2, ... an, lambda: "123456")
Piénsalo así. El token que necesita, es un argumento de la función de biblioteca. Dado que el valor para el token puede no ser conocido de forma estática en el sitio de la llamada, realmente no se puede pedir el valor como un argumento. En su lugar, la persona que llama debe proporcionar una función que será responsable de proporcionar el token cuando se le llame.
Toda la responsabilidad de proporcionar la mecánica exacta del token ahora se externaliza desde la función de biblioteca. El consumidor de la función ahora es responsable de adquirir el token por cualquier medio disponible en tiempo de ejecución. Puede solicitar STDIN, pero también puede actuar como una puerta de enlace de correo, esperar a que aparezca el mensaje en la bandeja de entrada, leerlo, extraer el token y automatizar completamente el proceso. Puede ser un diálogo GUI o un formulario basado en web. En realidad, todas las opciones están ahora en manos del consumidor de la biblioteca.