codeop
¶
Utilities to compile possibly incomplete Python source code.
This module provides two interfaces, broadly similar to the builtin function compile(), which take program text, a filename and a ‘mode’ and:
- Return code object if the command is complete and valid
- Return None if the command is incomplete
- Raise SyntaxError, ValueError or OverflowError if the command is a syntax error (OverflowError and ValueError can be produced by malformed literals).
Approach:
First, check if the source consists entirely of blank lines and comments; if so, replace it with ‘pass’, because the built-in parser doesn’t always do the right thing for these.
Compile three times: as is, with n, and with nn appended. If it compiles as is, it’s complete. If it compiles with one n appended, we expect more. If it doesn’t compile either way, we compare the error we get when compiling with n or nn appended. If the errors are the same, the code is broken. But if the errors are different, we expect more. Not intuitive; not even guaranteed to hold in future releases; but this matches the compiler’s behavior from Python 1.4 through 2.2, at least.
Caveat:
It is possible (but not likely) that the parser stops parsing with a successful outcome before reaching the end of the source; in this case, trailing symbols may be ignored instead of causing an error. For example, a backslash followed by two newlines may be followed by arbitrary garbage. This will be fixed once the API for the parser is better.
The two interfaces are:
compile_command(source, filename, symbol):
Compiles a single command in the manner described above.
CommandCompiler():
Instances of this class have __call__ methods identical in signature to compile_command; the difference is that if the instance compiles program text containing a __future__ statement, the instance ‘remembers’ and compiles all subsequent program texts with the statement in force.
The module also provides another class:
Compile():
Instances of this class act like the built-in function compile, but with ‘memory’ in the sense described above.
Functions¶
compile_command (source[, filename, symbol]) |
Compile a command and determine whether it is incomplete. |
Classes¶
CommandCompiler () |
Instances of this class have __call__ methods identical in signature to compile_command; the difference is that if the instance compiles program text containing a __future__ statement, the instance ‘remembers’ and compiles all subsequent program texts with the statement in force. |
Compile () |
Instances of this class behave much like the built-in compile function, but if one is used to compile text containing a future statement, it “remembers” and compiles all subsequent program texts with the statement in force. |