170 lines
6.0 KiB
Plaintext
170 lines
6.0 KiB
Plaintext
|
PEP: 244
|
|||
|
Title: The `directive' statement
|
|||
|
Version: $Revision$
|
|||
|
Author: loewis@informatik.hu-berlin.de (Martin von Loewis)
|
|||
|
Status: Active
|
|||
|
Type: Standards Track
|
|||
|
Created: 20-Mar-2001
|
|||
|
Python-Version: 2.1
|
|||
|
Post-History:
|
|||
|
|
|||
|
|
|||
|
Motivation
|
|||
|
|
|||
|
From time to time, Python makes an incompatible change to the
|
|||
|
advertised semantics of core language constructs, or changes their
|
|||
|
accidental (implementation-dependent) behavior in some way. While
|
|||
|
this is never done capriciously, and is always done with the aim
|
|||
|
of improving the language over the long term, over the short term
|
|||
|
it's contentious and disrupting.
|
|||
|
|
|||
|
The "Guidelines for Language Evolution" PEP [1] suggests ways to
|
|||
|
ease the pain, and this PEP introduces some machinery in support
|
|||
|
of that.
|
|||
|
|
|||
|
The "Statically Nested Scopes" PEP [2] is the first application,
|
|||
|
and will be used as an example here.
|
|||
|
|
|||
|
When a new, potentially incompatible language feature is added,
|
|||
|
some modules and libraries may chose to use it, while others may
|
|||
|
not. This specification introduces a syntax where a module author
|
|||
|
can denote whether a certain language feature is used in the
|
|||
|
module or not.
|
|||
|
|
|||
|
In discussion of this PEP, readers commented that there are two
|
|||
|
kinds of "settable" language features:
|
|||
|
|
|||
|
- those that are designed to eventually become the only option, at
|
|||
|
which time specifying use of them is not necessary anymore. The
|
|||
|
features for which the syntax of the "Back to the __future__"
|
|||
|
PEP [3] was proposed fall into this category. This PEP supports
|
|||
|
declaring such features, and supports phasing out the "old"
|
|||
|
meaning of constructs whose semantics has changed under the new
|
|||
|
feature. However, it defines no policy as to what features must
|
|||
|
be phased out eventually.
|
|||
|
|
|||
|
- those which are designed to stay optional forever, e.g. if they
|
|||
|
change some default setting in the interpreter. An example for
|
|||
|
such settings might be the request to always emit line-number
|
|||
|
instructions for a certain module; no specific flags of that
|
|||
|
kind are proposed in this specification.
|
|||
|
|
|||
|
Since a primary goal of this PEP is to support new language
|
|||
|
constructs without immediately breaking old libraries, special
|
|||
|
care was taken not to break old libraries by introducing the new
|
|||
|
syntax.
|
|||
|
|
|||
|
|
|||
|
Syntax
|
|||
|
|
|||
|
A directive_statement is a statement of the form
|
|||
|
|
|||
|
directive_statement: 'directive' NAME [atom] [';'] NEWLINE
|
|||
|
|
|||
|
The name in the directive indicates the kind of the directive; it
|
|||
|
defines whether the optional atom can be present, and whether
|
|||
|
there are further syntactical or semantical restrictions to the
|
|||
|
atom. In addition, depending on the name of the directive,
|
|||
|
certain additional syntactical or semantical restrictions may be
|
|||
|
placed on the directive (e.g. placement of the directive in the
|
|||
|
module may be restricted to the top of the module).
|
|||
|
|
|||
|
In the directive_statement, 'directive' is a new
|
|||
|
keyword. According to [1], this keyword is initially considered as
|
|||
|
a keyword only when used in a directive statement, see "Backwards
|
|||
|
Compatibility" below.
|
|||
|
|
|||
|
|
|||
|
Semantics
|
|||
|
|
|||
|
A directive statement instructs the Python interpreter to process
|
|||
|
a source file in a different way; the specific details of that
|
|||
|
processing depend on the directive name. The optional atom is
|
|||
|
typically interpreted when the source code is processed; details
|
|||
|
of that interpretation depend on the directive.
|
|||
|
|
|||
|
|
|||
|
Specific Directives: transitional
|
|||
|
|
|||
|
If a syntactical or semantical change is added to Python which is
|
|||
|
incompatible, [1] mandates a transitional evolution of the
|
|||
|
language, where the new feature is initially available alongside
|
|||
|
with the old one. Such a transition is possible by means of the
|
|||
|
transitional directive.
|
|||
|
|
|||
|
In a transitional directive, the NAME is 'transitional'. The atom
|
|||
|
MUST be present, and it MUST be a NAME. The possible values for
|
|||
|
that name are defined when the language change is defined. One
|
|||
|
example for such a directive is
|
|||
|
|
|||
|
directive transitional nested_scopes
|
|||
|
|
|||
|
The transitional directive MUST occur at before any other
|
|||
|
statement in a module, except for the documentation string
|
|||
|
(i.e. it may appear as the second statement of a module only if
|
|||
|
the first statement is a STRING+).
|
|||
|
|
|||
|
|
|||
|
Backwards Compatibility
|
|||
|
|
|||
|
Introducing 'directive' as a new keyword might cause
|
|||
|
incompatibilities with existing code. Following the guideline in
|
|||
|
[1], in the initial implementation of this specification,
|
|||
|
directive is a new keyword only if it was used in a valid
|
|||
|
directive_statement (i.e. if it appeared as the first non-string
|
|||
|
token in a module).
|
|||
|
|
|||
|
|
|||
|
Unresolved Problems: directive as the first identifier
|
|||
|
|
|||
|
Using directive in a module as
|
|||
|
|
|||
|
directive = 1
|
|||
|
|
|||
|
(i.e. the name directive appears as the first thing in a module)
|
|||
|
will treat it as keyword, not as identifier. It would be possible
|
|||
|
to classify it as a NAME with an additional look-ahead token, but
|
|||
|
such look-ahead is not available in the Python tokenizer.
|
|||
|
|
|||
|
|
|||
|
Questions and Answers
|
|||
|
|
|||
|
Q: It looks like this PEP was written to allow definition of source
|
|||
|
code character sets. Is that true?
|
|||
|
|
|||
|
A: No. Even though the directive facility can be extended to
|
|||
|
allow source code encodings, no specific directive is proposed.
|
|||
|
|
|||
|
Q: Then why was this PEP written at all?
|
|||
|
|
|||
|
A: It acts as a counter-proposal to [3], which proposes to
|
|||
|
overload the import statement with a new meaning. This PEP
|
|||
|
allows to solve the problem in a more general way.
|
|||
|
|
|||
|
Q: But isn't mixing source encodings and language changes like
|
|||
|
mixing apples and oranges?
|
|||
|
|
|||
|
A: Perhaps. To address the difference, the predefined
|
|||
|
"transitional" directive has been defined.
|
|||
|
|
|||
|
|
|||
|
References and Footnotes
|
|||
|
|
|||
|
[1] http://python.sourceforge.net/peps/pep-0005.html
|
|||
|
|
|||
|
[2] http://python.sourceforge.net/peps/pep-0227.html
|
|||
|
|
|||
|
[3] http://python.sourceforge.net/peps/pep-0236.html
|
|||
|
|
|||
|
|
|||
|
Copyright
|
|||
|
|
|||
|
This document has been placed in the public domain.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Local Variables:
|
|||
|
mode: indented-text
|
|||
|
indent-tabs-mode: nil
|
|||
|
End:
|