A resposta de @Paul92 é boa discussão geral, mas eu gostaria de oferecer uma possível solução clean (ish) para isso:
Como uma biblioteca, esse código precisa ser adaptável a qualquer ambiente de tempo de execução, portanto, você não pode realmente pedir STDIN
para algum bit de dados crucial. Por um lado, os usuários de sua biblioteca podem não ter stdin disponível por vários motivos. Em vez disso, você pode querer usar alguma forma de padrão estratégia para personalizar como o token deve ser recuperado.
No Python, provavelmente a melhor opção é passar a estratégia de busca de tokens como um parâmetro de função. Algo assim:
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")
Pense nisso assim. O token que você precisa é um argumento para a função da biblioteca. Como o valor do token pode não ser estaticamente conhecido no site de chamada, você não pode realmente solicitar o valor como um argumento. Em vez disso, o chamador deve fornecer uma função que será responsável por fornecer o token quando chamado.
Toda a responsabilidade de fornecer a mecânica exata do token é agora externalizada da função de biblioteca. O consumidor da função agora é responsável por adquirir o token por qualquer meio que esteja disponível em tempo de execução. Ele pode perguntar ao STDIN, mas também pode funcionar como um gateway de correio, aguardar que a mensagem seja exibida na caixa de entrada, ler, extrair o token e automatizar completamente o processo. Pode ser uma caixa de diálogo da GUI ou um formulário baseado na web. Qualquer coisa realmente - todas as opções estão agora nas mãos do consumidor da biblioteca.