LINUX.ORG.RU

Релиз Python 3.8

 ,


2

2

Наиболее интересные новшества:

  • Присваивающее выражение:

    Новый оператор := позволяет присваивать значения переменным внутри выражений. Например:

    if (n := len(a)) > 10:
        print(f"List is too long ({n} elements, expected <= 10)")
    

  • Positional-only аргументы:

    Теперь можно указать, какие параметры функций можно передавать через синтаксис именованных аргументов, а какие нет. Пример:

    def f(a, b, /, c, d, *, e, f):
        print(a, b, c, d, e, f)
    
    f(10, 20, 30, d=40, e=50, f=60) # OK
    f(10, b=20, c=30, d=40, e=50, f=60)   # ошибка, `b` не может быть именованным аргументом
    f(10, 20, 30, 40, 50, f=60)           # ошибка, `e` обязан быть именованным аргументом
    
    Это изменение дает разработчикам способ обезопасить пользователей своих API от изменений в названии аргументов функций.

  • Поддержка f-строками = для самодокументирующих выражений и отладки:

    Добавлен сахар для упрощения отладочных/логгирующих сообщений.

    n = 42
    print(f'Hello world {n=}.')
    # напечатает "Hello world n=42."

  • Исправлено ключевое слово continue в блоке finally (раньше оно не работало).

Прочее:

  • Можно явно указать путь к кэшу байткода вместо дефолтного __pycache__.
  • Debug и Release сборки используют один и тот же ABI.

>>> Подробности

anonymous

Проверено: a1batross ()

Ответ на: комментарий от alexferman

Запахло Паскалем и Го)

Я редко пишу на питоне, но буквально неделю назад мне была нужна именно эта фича: в цепочке if-elif-elif-else нужно было сделать что-то типа

if m = re.match(...):
    print(m.group(1))

Пришлось городить костыли. IMO это лучшее изменение в этом релизе.

anonymous ()

Новый оператор := позволяет присваивать значения переменным внутри выражений.

Рано или поздно все приходят к тому, что конструкции, которые испокон веков были в Си - удобны.

Kroz ★★★★★ ()
Ответ на: комментарий от alexferman

Похожую фичу не так давно даже в C++ добавили, в 17-й кажется. Только менее универсально:

if (statement; condition)

Пример:

if (a = f(); if a > 0) {
   ....
} else if (a = g(); if a > 0) {
   ....
}

Зато вот это:

Теперь можно указать, какие параметры функций можно передавать через синтаксис keywords, а какие нет.

воняет очень мощно. Переусложнённостью. По крайней мере с точки зрения человека, которому за глаза хватало правил method overloading в скале.

Но это к слову. На самом деле, питон не нужен.

dimgel ★★ ()
Последнее исправление: dimgel (всего исправлений: 2)
Ответ на: комментарий от Kroz

М-да, чёт я прогнал. Оно и правда всегда можно было. Это ж насколько промытые у меня мозги утверждениями, что это нечитабельно, error prone и так делать нельзя.

dimgel ★★ ()

n := len И сразу сломали обратную совместимость. Куча дистрибутивов (цент, рхел, дебиан) куда 3.8 доберется примерно лет через надцать.

dnb ★★ ()
Ответ на: комментарий от alexferman
Python 3.7.4 (default, Oct  4 2019, 06:57:26) 
Type 'copyright', 'credits' or 'license' for more information
IPython 7.6.1 -- An enhanced Interactive Python. Type '?' for help.

In [1]: if (n := len(a)) > 10: 
   ...:     print(f"List is too long ({n} elements, expected <= 10)")                                                                        
  File "<ipython-input-1-60741718a228>", line 1
    if (n := len(a)) > 10:
          ^
SyntaxError: invalid syntax
dnb ★★ ()
Ответ на: комментарий от a1batross

Это не обратная совместимость. Нарушение обратной совместимости это когда старый код перестаёт работать на новых версиях.

А когда новый код не работает на старых версиях это вообще норма (ибо разработчики не могут видеть будущее)

alexferman ★★ ()
Последнее исправление: alexferman (всего исправлений: 1)
Ответ на: комментарий от alexferman

Тогда... просто совместимость?

В любом случае, пока все не обновятся до 3.8, наврядли кто-то в здравом уме это будет использовать, что как бы не очень хорошо для языка, наверное. И наоборот, если кто-то воспользуется, админам с рхелами и дебианами придётся вручную править скрипты.

a1batross ★★★★★ ()
Ответ на: комментарий от a1batross

Думаю, добавление новых функций в новых версиях вообще нельзя назвать поломкой какой-либо совместимости. По крайней мере, я ни разу не слышал, чтобы такое говорили в этом контексте.

alexferman ★★ ()
Ответ на: комментарий от alexferman

А как назвать? Вот допустим разработчик gimp'а использует конструкцию n := len(), и ведь у него на арче все ок работает. Но скачает обновление пользователь дебиана или убунты, и него gimp перестанет работать. Я бы еще понял, если бы это было в расте, там каждый день новые извращения добавляют потому что серьезный софт не пишут на этом расте и можно не бояться сломать совместимость (необратную).

dnb ★★ ()
Ответ на: комментарий от dnb

Вот допустим разработчик gimp'а использует конструкцию n := len(), и ведь у него на арче все ок работает. Но скачает обновление пользователь дебиана или убунты, и него gimp перестанет работать

Чем это отличается от:

Вот допустим разработчик Гимпа использует функцию А из библиотеки а11, и ведь у него на Арче всё ок работает. Но скачает обновление пользователь Дебиана или Убунты, и у него Гимп перестанет работать, потому что в репах до сих пор библиотека а9

?

Да ничем, обычные дистрибутивопроблемы.

alexferman ★★ ()
Ответ на: комментарий от alexferman

Запахло Паскалем

Как раз наоборот, в паскале этого маразма не было. Это сишники любят разгребать баги и уязвимости на ровном месте, в коде уровня if (uid = 0).

https://anticopyright.ru/wiki/Wait4()

Но лексема ":=" должна такое предотвращать.

anonymous ()
Ответ на: комментарий от dnb

Допустим разработчик гимпа в зависимостях указывает, что иптон не менее 3.8. Пока майнтейнеры не соберут новый питон, в репе будет торчать окаменевший стабильный гимп.

Так собственно, дебиан и работает.

ZhAN ★★ ()
Ответ на: комментарий от dnb

Глупости не пишите. На дебиане/убунте юзер не будет компилировать софт сам из исходников. Установит пакет и ему не будет никакого дела, что в системе у него стоит конпелятор rustc, который не сможет собрать софтину из сорцов.

Virtuos86 ★★★★★ ()
Ответ на: комментарий от dnb

А как назвать?

Нормой. Если язык развивается, то это совершенно естественная ситуация. Даже если сам синтаксис не трогают, всё равно появляются новые библиотеки, которых тоже может не оказаться в твоём окаменевшем дебиане.

Вот допустим разработчик gimp’а использует конструкцию n := len(), и ведь у него на арче все ок работает. Но скачает обновление пользователь дебиана или убунты, и него gimp перестанет работать.

Это остаётся на совести разработчика gimp’а. Не надо обвинять мастера, сделавшего ножик, в том, что этим ножиком кого-то зарезали.

Если разработчик не хочет сломать совместимость своего кода со старыми версиями интерпретатора/компилятора, то он просто не использует новые фичи.

PS. Хотя это, конечно, не отменяет того, что у питона изначально говённый дизайн, который приходится подпирать такими вот убогими костылями.

anonymous ()
Ответ на: комментарий от olelookoe

М-да, и этот синаксис забыл... Хотя не, вспомнил: в новом синтаксисе есть другая польза, ранее недоступная: можно переменные объявлять, и областью видимости будет и условие, и тело if:

if (int a = f(); a > 0) {
    cout << a;
} else if (string a = g(); a > 0) {
    cout << a;
}
dimgel ★★ ()

Новый оператор := позволяет присваивать значения переменным внутри выражений.

От иллюстраций к этой фиче в whatsnew и в PEP 572 у меня что-то подгорело. Поощрять сайд-эффекты внутри if и внутри comprehension, «блестящая» идея. Сколько будет с использованием этой штуки ребусов понаписано :(

Manhunt ★★★★★ ()
Последнее исправление: Manhunt (всего исправлений: 1)