Commit | Line | Data |
---|---|---|
86530b38 AT |
1 | """Record of phased-in incompatible language changes. |
2 | ||
3 | Each line is of the form: | |
4 | ||
5 | FeatureName = "_Feature(" OptionalRelease "," MandatoryRelease "," | |
6 | CompilerFlag ")" | |
7 | ||
8 | where, normally, OptionalRelease < MandatoryRelease, and both are 5-tuples | |
9 | of the same form as sys.version_info: | |
10 | ||
11 | (PY_MAJOR_VERSION, # the 2 in 2.1.0a3; an int | |
12 | PY_MINOR_VERSION, # the 1; an int | |
13 | PY_MICRO_VERSION, # the 0; an int | |
14 | PY_RELEASE_LEVEL, # "alpha", "beta", "candidate" or "final"; string | |
15 | PY_RELEASE_SERIAL # the 3; an int | |
16 | ) | |
17 | ||
18 | OptionalRelease records the first release in which | |
19 | ||
20 | from __future__ import FeatureName | |
21 | ||
22 | was accepted. | |
23 | ||
24 | In the case of MandatoryReleases that have not yet occurred, | |
25 | MandatoryRelease predicts the release in which the feature will become part | |
26 | of the language. | |
27 | ||
28 | Else MandatoryRelease records when the feature became part of the language; | |
29 | in releases at or after that, modules no longer need | |
30 | ||
31 | from __future__ import FeatureName | |
32 | ||
33 | to use the feature in question, but may continue to use such imports. | |
34 | ||
35 | MandatoryRelease may also be None, meaning that a planned feature got | |
36 | dropped. | |
37 | ||
38 | Instances of class _Feature have two corresponding methods, | |
39 | .getOptionalRelease() and .getMandatoryRelease(). | |
40 | ||
41 | CompilerFlag is the (bitfield) flag that should be passed in the fourth | |
42 | argument to the builtin function compile() to enable the feature in | |
43 | dynamically compiled code. This flag is stored in the .compiler_flag | |
44 | attribute on _Future instances. These values must match the appropriate | |
45 | #defines of CO_xxx flags in Include/compile.h. | |
46 | ||
47 | No feature line is ever to be deleted from this file. | |
48 | """ | |
49 | ||
50 | all_feature_names = [ | |
51 | "nested_scopes", | |
52 | "generators", | |
53 | "division", | |
54 | ] | |
55 | ||
56 | __all__ = ["all_feature_names"] + all_feature_names | |
57 | ||
58 | # The CO_xxx symbols are defined here under the same names used by | |
59 | # compile.h, so that an editor search will find them here. However, | |
60 | # they're not exported in __all__, because they don't really belong to | |
61 | # this module. | |
62 | CO_NESTED = 0x0010 # nested_scopes | |
63 | CO_GENERATOR_ALLOWED = 0x1000 # generators | |
64 | CO_FUTURE_DIVISION = 0x2000 # division | |
65 | ||
66 | class _Feature: | |
67 | def __init__(self, optionalRelease, mandatoryRelease, compiler_flag): | |
68 | self.optional = optionalRelease | |
69 | self.mandatory = mandatoryRelease | |
70 | self.compiler_flag = compiler_flag | |
71 | ||
72 | def getOptionalRelease(self): | |
73 | """Return first release in which this feature was recognized. | |
74 | ||
75 | This is a 5-tuple, of the same form as sys.version_info. | |
76 | """ | |
77 | ||
78 | return self.optional | |
79 | ||
80 | def getMandatoryRelease(self): | |
81 | """Return release in which this feature will become mandatory. | |
82 | ||
83 | This is a 5-tuple, of the same form as sys.version_info, or, if | |
84 | the feature was dropped, is None. | |
85 | """ | |
86 | ||
87 | return self.mandatory | |
88 | ||
89 | def __repr__(self): | |
90 | return "_Feature" + repr((self.optional, | |
91 | self.mandatory, | |
92 | self.compiler_flag)) | |
93 | ||
94 | nested_scopes = _Feature((2, 1, 0, "beta", 1), | |
95 | (2, 2, 0, "alpha", 0), | |
96 | CO_NESTED) | |
97 | ||
98 | generators = _Feature((2, 2, 0, "alpha", 1), | |
99 | (2, 3, 0, "final", 0), | |
100 | CO_GENERATOR_ALLOWED) | |
101 | ||
102 | division = _Feature((2, 2, 0, "alpha", 2), | |
103 | (3, 0, 0, "alpha", 0), | |
104 | CO_FUTURE_DIVISION) |