code — Classes Bases do Interpretador

Código-fonte: Lib/code.py


O módulo code fornece facilidades para implementar laços de leitura-execução-escrita no código Python. São incluídas duas classes e funções de conveniência que podem ser usadas para criar aplicações que fornecem um prompt de interpretador interativo.

class code.InteractiveInterpreter(locals=None)

Esta classe trata de analisar e interpretar o estado (espaço de nome do usuário); o mesmo não lida com buffer de entrada ou solicitação ou nomeação de arquivo de entrada (o nome do arquivo é sempre passado explicitamente). O argumento opcional local especifica o dicionário no qual o código será executado; ele é padrão para um dicionário recém-criado com a chave '__name__' set to '__console__' and key '__doc__' definido com None.

class code.InteractiveConsole(locals=None, filename='<console>')

Emula de forma bem similiar o comportamento do interpretador Python interativo. Esta classe se baseia em InteractiveInterpreter e adiciona prompting usando os familiares sys.ps1 e sys.ps2, e buffering de entrada.

code.interact(banner=None, readfunc=None, local=None, exitmsg=None)

Convenience function to run a read-eval-print loop. This creates a new instance of InteractiveConsole and sets readfunc to be used as the InteractiveConsole.raw_input() method, if provided. If local is provided, it is passed to the InteractiveConsole constructor for use as the default namespace for the interpreter loop. The interact() method of the instance is then run with banner and exitmsg passed as the banner and exit message to use, if provided. The console object is discarded after use.

Alterado na versão 3.6: Parâmetro adicionado exitmsg.

code.compile_command(source, filename='<input>', symbol='single')

Esta função é útil para programas que desejam emular o laço principal do interpretador Python (também conhecido como laço de leitura-execução-impressão). A parte complicada é determinar quando o usuário digitou um comando incompleto que pode ser concluído inserindo mais texto (em vez de um comando completo ou um erro de sintaxe). Esta função quase sempre toma a mesma decisão que o laço principal do interpretador real.

source é a string fonte; filename é o nome do arquivo opcional do qual a fonte foi lida, sendo o padrão '<input>'; e symbol é o símbolo opcional de início da gramática, que deve ser 'single' (o padrão), 'eval' ou 'exec'.

Retorna um objeto código (o mesmo que compile(source, filename, symbol)) se o comando for completo e válido; None se o comando estiver incompleto; levanta SyntaxError se o comando estiver completo e contém um erro de sintaxe, ou levanta OverflowError ou ValueError se o comando contiver um literal inválido.

Objetos de interpretador interativo

InteractiveInterpreter.runsource(source, filename='<input>', symbol='single')

Compila e executa alguma fonte no interpretador. Os argumentos são os mesmos de compile_command(); o padrão para filename é '<input>', e para symbol é 'single'. Uma de várias coisas pode acontecer:

O valor de retorno pode ser usado para decidir se usar sys.ps1 ou sys.ps2 para solicitar a próxima linha.

InteractiveInterpreter.runcode(code)

Executa um objeto código. Quando ocorre uma exceção, showtraceback() é chamado para exibir um traceback. Todas as exceções são capturadas, exceto SystemExit, que pode ser propagada.

Uma observação sobre KeyboardInterrupt: esta exceção pode ocorrer em outro lugar neste código e nem sempre pode ser detectada. O chamador deve estar preparado para lidar com isso.

InteractiveInterpreter.showsyntaxerror(filename=None)

Exibe o erro de sintaxe que acabou de ocorrer. Isso não exibe um stack trace (situação da pilha de execução) porque não há um para erros de sintaxe. Se filename for fornecido, ele será inserido na exceção em vez do nome de arquivo padrão fornecido pelo analisador sintático do Python, porque ele sempre usa '<string>' ao ler uma string. A saída é escrita pelo método write().

InteractiveInterpreter.showtraceback()

Exibe a exceção que acabou de ocorrer. Removemos o primeiro item da pilha porque ele está dentro da implementação do objeto interpretador. A saída é escrita pelo método write().

Alterado na versão 3.5: O traceback encadeado completo é exibido em vez de apenas o traceback primário.

InteractiveInterpreter.write(data)

Escreve uma string no fluxo de erro padrão (sys.stderr). As classes derivadas devem substituir isso para fornecer o tratamento de saída apropriado conforme necessário.

Objetos de console Interativo

A classe InteractiveConsole é uma subclasse de InteractiveInterpreter e, portanto, oferece todos os métodos dos objetos interpretadores, bem como as seguintes adições.

InteractiveConsole.interact(banner=None, exitmsg=None)

Emula de forma muito semelhante o console interativo do Python. O argumento opcional banner especifica o banner a ser impresso antes da primeira interação; por padrão ele imprime um banner semelhante ao impresso pelo interpretador Python padrão, seguido pelo nome da classe do objeto console entre parênteses (para não confundir isso com o interpretador real – já que está tão próximo!).

O argumento opcional exitmsg especifica uma mensagem de saída impressa ao sair. Passe a string vazia para suprimir a mensagem de saída. Se exitmsg não for fornecido ou None, uma mensagem padrão será impressa.

Alterado na versão 3.4: Para suprimir a impressão de qualquer banner, passe uma string vazia.

Alterado na versão 3.6: Imprime uma mensagem de saída ao sair.

InteractiveConsole.push(line)

Envia uma linha do texto fonte para o interpretador. A linha não deve ter uma nova linha à direita; pode ter novas linhas internas. A linha é anexada a um buffer e o método runsource() do interpretador é chamado com o conteúdo concatenado do buffer como fonte. Se isso indicar que o comando foi executado ou é inválido, o buffer será redefinido; caso contrário, o comando estará incompleto e o buffer permanecerá como estava após a linha ser anexada. O valor de retorno é True se mais entrada for necessária, False se a linha foi tratada de alguma forma (isto é o mesmo que runsource()).

InteractiveConsole.resetbuffer()

Remove qualquer texto fonte não tratado do buffer de entrada.

InteractiveConsole.raw_input(prompt='')

Escreve um prompt e leia uma linha. A linha retornada não inclui a nova linha final. Quando o usuário insere a sequência de teclas de fim de linha, uma exceção EOFError é levantada. A implementação base lê sys.stdin; uma subclasse pode substituir isso por uma implementação diferente.