La respuesta de @ Paul92 es una buena discusión general, pero me gustaría ofrecer una posible solución limpia (ish) a esto:
Como una biblioteca, este código debe ser adaptable a cualquier entorno de tiempo de ejecución, por lo que realmente no puede solicitar STDIN
algunos datos cruciales. Por un lado, los usuarios de su biblioteca podrían no tener stdin disponible por varias razones. 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 recuperación de tokens como un parámetro de función. Algo como eso:
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")
Piensa en esto, de esta manera. El token que necesita es un argumento para la función de biblioteca. Dado que el valor del token puede no ser conocido estáticamente en el sitio de la llamada, realmente no puede solicitar el valor como argumento. En cambio, la persona que llama tiene que 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 el mensaje aparezca en la bandeja de entrada, leerlo, extraer el token y automatizar completamente el proceso. Puede ser un cuadro de diálogo GUI o un formulario basado en web. Cualquier cosa realmente: todas las opciones están ahora en manos del consumidor de la biblioteca.