Можно ли удалить все операторы __future__ из кода Python, не влияя на его функциональность с помощью Python 3.7.1? - PullRequest
0 голосов
/ 18 декабря 2018

Могут ли следующие операторы __future__ быть удалены из исходного кода без ущерба для его функциональности, если я использую python 3.7.1?

from __future__ import nested_scopes
from __future__ import generators
from __future__ import division
from __future__ import absolute_import
from __future__ import with_statement
from __future__ import print_function
from __future__ import unicode_literals

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

Это задокументировано в файле lib/python3.7/__future__.py.Каждому будущему импорту (здесь называемому _Feature) дается две 5-кортежи, определяющие необязательные и обязательные выпуски соответственно.Здесь «обязательный выпуск» означает, какая версия Python включает эту функцию по умолчанию.Как видно из приведенной выше ссылки, все обязательные версии <3.7.1, кроме двух, а именно <a href="https://www.python.org/dev/peps/pep-0401/" rel="nofollow noreferrer">barry_as_FLUFL (обязательно в версии 3.9.0) и annotations (обязательно в версии 4.0.0), первое из которых - просто пасхальное яйцо.

Все последующие импорты из вашего списка действительно могут быть удалены при использовании Python 3.7.1 или новее с точно таким же выполнением кодагарантировано.Как отметили другие, это может быть не очень хорошей идеей, так как это снижает совместимость кода.

0 голосов
/ 18 декабря 2018

Вы можете удалить эти __future__ импорт без ущерба для функциональности, но удаление их не является необходимым и прекращает совместимость с более ранними версиями Python.

Более того, как @deceze ссылается на егокомментарий, другой импорт может отличаться.Например, from __future__ import annotations это только включено в Python <= 4.0 через импорт, поэтому добавление / удаление этой строки повлияет на функциональность: </p>

Поскольку это изменение нарушает совместимость, новое поведение должно быть включено для каждого модуля в Python 3.7 с использованием __future__ import:

from __future__ import annotations

. Это станет значением по умолчанию вPython 4.0.

Как указывает @jmd_dk, вы можете найти эту информацию в модуле __future__.Я написал короткий скрипт для его извлечения:

import __future__
import ast
import sys

print('Python version:', sys.version_info)

sys_t = sys.version_info[:3]

s = '__future__ import {} {} for you; the version: {} vs. your version: {}'

for name in __future__.all_feature_names:
    optional, mandatory, _ = ast.literal_eval(str(getattr(__future__, name)).lstrip('_Featur'))
    optional, mandatory = optional[:3], mandatory[:3]
    print('\nName: {}'.format(name))
    tmp = [None, None, optional, sys_t]
    if optional <= sys_t:
        tmp[:2] = 'is', 'included'
    else:
        tmp[:2] = 'not', 'included'
    print(s.format(*tmp))
    tmp[2] = mandatory
    if mandatory <= sys_t:
        tmp[:2] = 'is', 'fixed'
    else:
        tmp[:2] = 'not', 'fixed'
    print(s.format(*tmp))

В моей системе это выдает:

Python version: sys.version_info(major=3, minor=7, micro=1, releaselevel='final', serial=0)

Name: nested_scopes
__future__ import is included for you; the version: (2, 1, 0) vs. your version: (3, 7, 1)
__future__ import is fixed for you; the version: (2, 2, 0) vs. your version: (3, 7, 1)

Name: generators
__future__ import is included for you; the version: (2, 2, 0) vs. your version: (3, 7, 1)
__future__ import is fixed for you; the version: (2, 3, 0) vs. your version: (3, 7, 1)

Name: division
__future__ import is included for you; the version: (2, 2, 0) vs. your version: (3, 7, 1)
__future__ import is fixed for you; the version: (3, 0, 0) vs. your version: (3, 7, 1)

Name: absolute_import
__future__ import is included for you; the version: (2, 5, 0) vs. your version: (3, 7, 1)
__future__ import is fixed for you; the version: (3, 0, 0) vs. your version: (3, 7, 1)

Name: with_statement
__future__ import is included for you; the version: (2, 5, 0) vs. your version: (3, 7, 1)
__future__ import is fixed for you; the version: (2, 6, 0) vs. your version: (3, 7, 1)

Name: print_function
__future__ import is included for you; the version: (2, 6, 0) vs. your version: (3, 7, 1)
__future__ import is fixed for you; the version: (3, 0, 0) vs. your version: (3, 7, 1)

Name: unicode_literals
__future__ import is included for you; the version: (2, 6, 0) vs. your version: (3, 7, 1)
__future__ import is fixed for you; the version: (3, 0, 0) vs. your version: (3, 7, 1)

Name: barry_as_FLUFL
__future__ import is included for you; the version: (3, 1, 0) vs. your version: (3, 7, 1)
__future__ import not fixed for you; the version: (3, 9, 0) vs. your version: (3, 7, 1)

Name: generator_stop
__future__ import is included for you; the version: (3, 5, 0) vs. your version: (3, 7, 1)
__future__ import is fixed for you; the version: (3, 7, 0) vs. your version: (3, 7, 1)

Name: annotations
__future__ import is included for you; the version: (3, 7, 0) vs. your version: (3, 7, 1)
__future__ import not fixed for you; the version: (4, 0, 0) vs. your version: (3, 7, 1)

Когда Python> = 3.8 вводит __future__ импорт (пока нет ни одного, пока янапишите это), удаление этих и запуск на Python 3.7, очевидно, повлияет на функциональность.

...