2001-08-08 11:30:13 -04:00
|
|
|
|
PEP: 264
|
2001-10-26 10:36:22 -04:00
|
|
|
|
Title: Future statements in simulated shells
|
|
|
|
|
Version: $Revision$
|
|
|
|
|
Last-Modified: $Date$
|
2001-08-08 11:30:13 -04:00
|
|
|
|
Author: Michael Hudson <mwh@python.net>
|
2001-10-26 10:36:22 -04:00
|
|
|
|
Status: Final
|
2001-08-08 11:30:13 -04:00
|
|
|
|
Type: Standards Track
|
|
|
|
|
Requires: 236
|
|
|
|
|
Created: 30-Jul-2001
|
|
|
|
|
Python-Version: 2.2
|
|
|
|
|
Post-History: 30-Jul-2001
|
|
|
|
|
|
2001-10-26 10:36:22 -04:00
|
|
|
|
|
2001-08-08 11:30:13 -04:00
|
|
|
|
Abstract
|
|
|
|
|
|
2001-08-10 18:47:51 -04:00
|
|
|
|
As noted in PEP 236, there is no clear way for "simulated
|
2001-08-08 11:30:13 -04:00
|
|
|
|
interactive shells" to simulate the behaviour of __future__
|
|
|
|
|
statements in "real" interactive shells, i.e. have __future__
|
|
|
|
|
statements' effects last the life of the shell.
|
|
|
|
|
|
2001-10-29 17:36:27 -05:00
|
|
|
|
The PEP also takes the opportunity to clean up the other
|
2001-08-10 18:45:19 -04:00
|
|
|
|
unresolved issue mentioned in PEP 236, the inability to stop
|
|
|
|
|
compile() inheriting the effect of future statements affecting the
|
|
|
|
|
code calling compile().
|
|
|
|
|
|
|
|
|
|
This PEP proposes to address the first problem by adding an
|
|
|
|
|
optional fourth argument to the builtin function "compile", adding
|
|
|
|
|
information to the _Feature instances defined in __future__.py and
|
2001-08-08 11:30:13 -04:00
|
|
|
|
adding machinery to the standard library modules "codeop" and
|
|
|
|
|
"code" to make the construction of such shells easy.
|
|
|
|
|
|
2001-08-10 18:45:19 -04:00
|
|
|
|
The second problem is dealt with by simply adding *another*
|
|
|
|
|
optional argument to compile(), which if non-zero suppresses the
|
|
|
|
|
inheriting of future statements' effects.
|
|
|
|
|
|
2001-08-08 11:30:13 -04:00
|
|
|
|
|
|
|
|
|
Specification
|
|
|
|
|
|
|
|
|
|
I propose adding a fourth, optional, "flags" argument to the
|
|
|
|
|
builtin "compile" function. If this argument is omitted,
|
|
|
|
|
there will be no change in behaviour from that of Python 2.1.
|
|
|
|
|
|
|
|
|
|
If it is present it is expected to be an integer, representing
|
|
|
|
|
various possible compile time options as a bitfield. The
|
2001-08-12 06:58:19 -04:00
|
|
|
|
bitfields will have the same values as the CO_* flags already used
|
|
|
|
|
by the C part of Python interpreter to refer to future statements.
|
2001-08-10 18:45:19 -04:00
|
|
|
|
|
|
|
|
|
compile() shall raise a ValueError exception if it does not
|
|
|
|
|
recognize any of the bits set in the supplied flags.
|
|
|
|
|
|
|
|
|
|
The flags supplied will be bitwise-"or"ed with the flags that
|
2001-08-12 06:58:19 -04:00
|
|
|
|
would be set anyway, unless the new fifth optional argument is a
|
|
|
|
|
non-zero intger, in which case the flags supplied will be exactly
|
|
|
|
|
the set used.
|
2001-08-10 18:45:19 -04:00
|
|
|
|
|
|
|
|
|
The above-mentioned flags are not currently exposed to Python. I
|
|
|
|
|
propose adding .compiler_flag attributes to the _Feature objects
|
|
|
|
|
in __future__.py that contain the necessary bits, so one might
|
|
|
|
|
write code such as:
|
2001-08-08 11:30:13 -04:00
|
|
|
|
|
2001-08-10 18:45:19 -04:00
|
|
|
|
import __future__
|
|
|
|
|
def compile_generator(func_def):
|
|
|
|
|
return compile(func_def, "<input>", "suite",
|
|
|
|
|
__future__.generators.compiler_flag)
|
|
|
|
|
|
|
|
|
|
A recent change means that these same bits can be used to tell if
|
|
|
|
|
a code object was compiled with a given feature; for instance
|
|
|
|
|
|
|
|
|
|
codeob.co_flags & __future__.generators.compiler_flag
|
|
|
|
|
|
|
|
|
|
will be non-zero if and only if the code object "codeob" was
|
|
|
|
|
compiled in an environment where generators were allowed.
|
|
|
|
|
|
2001-10-26 04:05:48 -04:00
|
|
|
|
I will also add a .all_feature_flags attribute to the __future__
|
|
|
|
|
module, giving a low-effort way of enumerating all the __future__
|
|
|
|
|
options supported by the running interpreter.
|
2001-08-08 11:30:13 -04:00
|
|
|
|
|
|
|
|
|
I also propose adding a pair of classes to the standard library
|
|
|
|
|
module codeop.
|
|
|
|
|
|
2001-10-26 04:05:48 -04:00
|
|
|
|
One - Compile - will sport a __call__ method which will act much
|
|
|
|
|
like the builtin "compile" of 2.1 with the difference that after
|
|
|
|
|
it has compiled a __future__ statement, it "remembers" it and
|
|
|
|
|
compiles all subsequent code with the __future__ option in effect.
|
2001-08-08 11:30:13 -04:00
|
|
|
|
|
2001-08-10 18:45:19 -04:00
|
|
|
|
It will do this by using the new features of the __future__ module
|
|
|
|
|
mentioned above.
|
2001-08-08 11:30:13 -04:00
|
|
|
|
|
2001-10-26 04:05:48 -04:00
|
|
|
|
Objects of the other class added to codeop - CommandCompiler -
|
|
|
|
|
will do the job of the existing codeop.compile_command function,
|
|
|
|
|
but in a __future__-aware way.
|
2001-08-08 11:30:13 -04:00
|
|
|
|
|
|
|
|
|
Finally, I propose to modify the class InteractiveInterpreter in
|
|
|
|
|
the standard library module code to use a CommandCompiler to
|
|
|
|
|
emulate still more closely the behaviour of the default Python
|
|
|
|
|
shell.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Backward Compatibility
|
|
|
|
|
|
|
|
|
|
Should be very few or none; the changes to compile will make no
|
|
|
|
|
difference to existing code, nor will adding new functions or
|
2001-08-10 18:45:19 -04:00
|
|
|
|
classes to codeop. Existing code using
|
2001-08-08 11:30:13 -04:00
|
|
|
|
code.InteractiveInterpreter may change in behaviour, but only for
|
|
|
|
|
the better in that the "real" Python shell will be being better
|
|
|
|
|
impersonated.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Forward Compatibility
|
|
|
|
|
|
2001-10-26 04:05:48 -04:00
|
|
|
|
The fiddling that needs to be done to Lib/__future__.py when
|
|
|
|
|
adding a __future_ feature will be a touch more complicated.
|
|
|
|
|
Everything else should just work.
|
2001-08-08 11:30:13 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Issues
|
|
|
|
|
|
2001-08-10 18:45:19 -04:00
|
|
|
|
I hope the above interface is not too disruptive to implement for
|
|
|
|
|
Jython.
|
2001-08-08 11:30:13 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Implementation
|
|
|
|
|
|
2001-10-26 04:05:48 -04:00
|
|
|
|
A series of preliminary implementations are at:
|
2001-08-08 11:30:13 -04:00
|
|
|
|
|
|
|
|
|
http://sourceforge.net/tracker/?func=detail&atid=305470&aid=449043&group_id=5470
|
|
|
|
|
|
2001-10-29 11:06:05 -05:00
|
|
|
|
After light massaging by Tim Peters, they have now been checked in.
|
2001-08-08 11:30:13 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Copyright
|
|
|
|
|
|
|
|
|
|
This document has been placed in the public domain.
|
|
|
|
|
|
2001-10-26 10:36:22 -04:00
|
|
|
|
|
2001-08-08 11:30:13 -04:00
|
|
|
|
|
|
|
|
|
Local Variables:
|
|
|
|
|
mode: indented-text
|
|
|
|
|
indent-tabs-mode: nil
|
|
|
|
|
End:
|