|
| 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 or that the release version is undetermined. |
| 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/cpython/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 | + "absolute_import", |
| 55 | + "with_statement", |
| 56 | + "print_function", |
| 57 | + "unicode_literals", |
| 58 | + "barry_as_FLUFL", |
| 59 | + "generator_stop", |
| 60 | + "annotations", |
| 61 | +] |
| 62 | + |
| 63 | +__all__ = ["all_feature_names"] + all_feature_names |
| 64 | + |
| 65 | +# The CO_xxx symbols are defined here under the same names defined in |
| 66 | +# code.h and used by compile.h, so that an editor search will find them here. |
| 67 | +# However, they're not exported in __all__, because they don't really belong to |
| 68 | +# this module. |
| 69 | +CO_NESTED = 0x0010 # nested_scopes |
| 70 | +CO_GENERATOR_ALLOWED = 0 # generators (obsolete, was 0x1000) |
| 71 | +CO_FUTURE_DIVISION = 0x20000 # division |
| 72 | +CO_FUTURE_ABSOLUTE_IMPORT = 0x40000 # perform absolute imports by default |
| 73 | +CO_FUTURE_WITH_STATEMENT = 0x80000 # with statement |
| 74 | +CO_FUTURE_PRINT_FUNCTION = 0x100000 # print function |
| 75 | +CO_FUTURE_UNICODE_LITERALS = 0x200000 # unicode string literals |
| 76 | +CO_FUTURE_BARRY_AS_BDFL = 0x400000 |
| 77 | +CO_FUTURE_GENERATOR_STOP = 0x800000 # StopIteration becomes RuntimeError in generators |
| 78 | +CO_FUTURE_ANNOTATIONS = 0x1000000 # annotations become strings at runtime |
| 79 | + |
| 80 | + |
| 81 | +class _Feature: |
| 82 | + |
| 83 | + def __init__(self, optionalRelease, mandatoryRelease, compiler_flag): |
| 84 | + self.optional = optionalRelease |
| 85 | + self.mandatory = mandatoryRelease |
| 86 | + self.compiler_flag = compiler_flag |
| 87 | + |
| 88 | + def getOptionalRelease(self): |
| 89 | + """Return first release in which this feature was recognized. |
| 90 | +
|
| 91 | + This is a 5-tuple, of the same form as sys.version_info. |
| 92 | + """ |
| 93 | + return self.optional |
| 94 | + |
| 95 | + def getMandatoryRelease(self): |
| 96 | + """Return release in which this feature will become mandatory. |
| 97 | +
|
| 98 | + This is a 5-tuple, of the same form as sys.version_info, or, if |
| 99 | + the feature was dropped, or the release date is undetermined, is None. |
| 100 | + """ |
| 101 | + return self.mandatory |
| 102 | + |
| 103 | + def __repr__(self): |
| 104 | + return "_Feature" + repr((self.optional, |
| 105 | + self.mandatory, |
| 106 | + self.compiler_flag)) |
| 107 | + |
| 108 | + |
| 109 | +nested_scopes = _Feature((2, 1, 0, "beta", 1), |
| 110 | + (2, 2, 0, "alpha", 0), |
| 111 | + CO_NESTED) |
| 112 | + |
| 113 | +generators = _Feature((2, 2, 0, "alpha", 1), |
| 114 | + (2, 3, 0, "final", 0), |
| 115 | + CO_GENERATOR_ALLOWED) |
| 116 | + |
| 117 | +division = _Feature((2, 2, 0, "alpha", 2), |
| 118 | + (3, 0, 0, "alpha", 0), |
| 119 | + CO_FUTURE_DIVISION) |
| 120 | + |
| 121 | +absolute_import = _Feature((2, 5, 0, "alpha", 1), |
| 122 | + (3, 0, 0, "alpha", 0), |
| 123 | + CO_FUTURE_ABSOLUTE_IMPORT) |
| 124 | + |
| 125 | +with_statement = _Feature((2, 5, 0, "alpha", 1), |
| 126 | + (2, 6, 0, "alpha", 0), |
| 127 | + CO_FUTURE_WITH_STATEMENT) |
| 128 | + |
| 129 | +print_function = _Feature((2, 6, 0, "alpha", 2), |
| 130 | + (3, 0, 0, "alpha", 0), |
| 131 | + CO_FUTURE_PRINT_FUNCTION) |
| 132 | + |
| 133 | +unicode_literals = _Feature((2, 6, 0, "alpha", 2), |
| 134 | + (3, 0, 0, "alpha", 0), |
| 135 | + CO_FUTURE_UNICODE_LITERALS) |
| 136 | + |
| 137 | +barry_as_FLUFL = _Feature((3, 1, 0, "alpha", 2), |
| 138 | + (4, 0, 0, "alpha", 0), |
| 139 | + CO_FUTURE_BARRY_AS_BDFL) |
| 140 | + |
| 141 | +generator_stop = _Feature((3, 5, 0, "beta", 1), |
| 142 | + (3, 7, 0, "alpha", 0), |
| 143 | + CO_FUTURE_GENERATOR_STOP) |
| 144 | + |
| 145 | +annotations = _Feature((3, 7, 0, "beta", 1), |
| 146 | + None, |
| 147 | + CO_FUTURE_ANNOTATIONS) |
0 commit comments