LINUX.ORG.RU

Релиз Python 3.8

 


3

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 ()
Последнее исправление: cetjs2 (всего исправлений: 5)

Позиционные аргументы выглядят, как наркомания.

Смешно, что эти люди критикуют скалу и хаскель.

А с {n=} - это даже смешно.

Вот := , возможно, и неплохо.

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

Было бы каррирование

Предлагаю «перевод»: выкурривание.

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

И сразу сломали обратную совместимость.

Это называется Forward compatibility. В русском языке устоялся термин «совместимость снизу вверх» или же просто «совместимость вверх».

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

Да, много лет назад была такая проблема. Сейчас компилятор ругнется на такое присваивание. Признаться нигде не видел в style guides крупных и не очень компаний правил ставить константу слева, лишь некоторые преподаватели предъявляют такие требования. Видимо такой стиль не очень хорошо воспринимается и большого распространения не получил. В книжках по математике так не пишут, хотя конечно вы правы, язык C имеет нотацию не соответствующую математической.

A-234 ★★★★★
()
Ответ на: комментарий от nihirash

Вот := , возможно, и неплохо.

Писать станет немного проще, читать - немного сложнее. Но мы ведь писатели, а не читатели, верно? :)

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

В одной из позиция говорят что если нужен доступ к приватным полям, то или тест делает что-то не то, или класс делает слишком много.

Класс обычно является композитом, и тесте обычно требуется заменить часть его полей (естественно, приватных) на mock-и. Это можно сделать либо забойлерплейтив основной код полноценной инъекцией зависимостей, либо тупо перебив приватные поля непосредственно в юнит-тесте. Выбор актуален в случае, когда с точки зрения продакшн-кода инъекция бессмысленна.

Manhunt ★★★★★
()
Ответ на: комментарий от A-234

Сейчас компилятор ругнется на такое присваивание

при включенном -Werror=parentheses, или -Wall -Werror

А уж сколько народу канпеляет в стиле gcc -O3 hello.c, или просто медитирует на пролетающие варнинги - не перечесть.

Кроме gcc есть и другие компиляторы, и платформы бывают очень разные, а там все тот же С, и проблемы те же. Проще однажды выработать рефлекс, чем полагаться на компилятор.

style guides крупных и не очень компаний

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

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

Лол. Переусложненность не нужна. В этом и плюс Питона. На мой взгляд, изменения в этом выпуске делают код менее читаемым.

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

Писать станет немного проще, читать - немного сложнее. Но мы ведь писатели, а не читатели, верно? :)

Ну я на питоне обычно не пишу.

За последнее время это были либо скрипты из нескольких строк, либо фиксы в чужих питонячих проектах типа pygopherd

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

Балабол, ты одни и те же хелловорлды перекидываешь то за свою точку зрения, то против. Это спор ради того, чтобы переспорить?

В конторах иногда встречаются такие типы, что пишут 0<a, но обычно их незначительное меньшинство и их детская аргументация не выдерживает включения ворнингов (которые и так включены так-то). Для особо упоротых приходится писать код стайл гайд.

anonymous
()

Похоже на ++, --, ... в C+++.
ИМХНО с ними легко «знатоки» легко «одним движением руки превращают код C++ в не readable».

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

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

ЛОЛ, в C и C++ такая фича с рождения.

if ((a = f()) > 0)
...

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

В новых плюсах можно ограничить скоуп этой переменной (сделать ее локальной для if-expression.

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

Я в курсе. Только возможность ограничить скоуп - это уже другая фича.

Esper
()
Ответ на: комментарий от dimgel

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

Если очень хочется странного, то такое можно провернуть и в православном C или в предыдущих версиях C++:

for (int a = f(); a > 0;) {
    cout << a;
    break;
}

Но ветку else сюда уже никак не вкорячить.

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

К 2050 г. и не позднее 2070 г. обязательно «выкатят» нормальный.

anonymous
()

3.8

Новый оператор :=

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

f'Hello world {n=}.'

Какая жесть, так испоганить все надо уметь. Первый раз задумался вместо питона перейти на что-то другое не потому что нашел что-то лучше, а потому что питон очевидно скатывается.

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

Не не так - «заслали казачка»"

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

А после 3.9 будет 4?

Обязательно будет, но только после 3.11.

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

Писать станет немного проще, читать - немного сложнее. Но мы ведь писатели, а не читатели, верно? :)

Кто же будет читать проприетарной код? Кто посмел? Кого еще не засудили за недополученную выгоду?

anonymous
()

>if (n := len(a)) > 10:

Кек. Я уж думал помру не дождуся. Но синтаксис. А чем обычное равно не угодило?

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

Это только «начало большого пути» ...

anonymous
()

Ждем, когда они добавят новые операторы

+:=
-:=
*:=
/:=
%:=
&:=
|:=
^:=
<<:=
>>:=
anonymous
()
Ответ на: комментарий от dnb

А она у питона вообще была? Там даже на hello world версию менять нельзя.

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

Все изменения какие-то бредово-наркоманские.

Так лучше?

fn f(&'a, &'b, /, &'c, &'d, *, &'e, &'f):
    println!(a, b, c, d, e, f)
anonymous
()
Ответ на: комментарий от Kroz

Это удобно, когда есть отдельная форма, которая позволит не путать `=` и `==`.

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

Я так понимаю, можно переменную прямо там и объявить.

Legioner ★★★★★
()

Один из самых приятных языков для быстрого написания кода.

Фича «Positional-only аргументы» мне кажется переусложненной, хотя и не знаю более простого способа реализовать это. Ну и хотелось бы, чтобы разработчики интерпретатора уделили больше внимания скорости работы языка: приходится переписывать различные скрипты для больших вычислений на другие языки гораздо чаще чем хочется.

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

Какая жесть, так испоганить все надо уметь. Первый раз задумался вместо питона перейти на что-то другое не потому что нашел что-то лучше, а потому что питон очевидно скатывается.

Возможностей сделать из простового скриптового языка сложный и универсальный Гвидо изначально в дизайне не предусмотрел. Поэтому питон поганят последние лет 10 и никаких надежд на то, что тенденция поменяется, нет.

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

Для альтернативно сообразительных.

Yoda conditional решает проблему даже если у тебя канпелятор не той системы. Или ты забыл\не знал чо где включить. Или ты в жабке пишешь if («stringconstant».equals(stringvariable)) { .... } потому что не хочешь собирать NPE.

Хочу спать спокойно, поэтому предпочитаю

if (LAUNCH_NUCLEAR_WEAPONS == currentSituation){
 }
а не читать потом на лор в последние 30 сек жизни планеты о том, как такой же самонадеянный олень что-то подправил в коде компилятора, другой олень вкрячил свежачок на билде, благодаря чему все стало еще более лучше на 30 наносек собираться. Просто чуть-чуть слегонца пролюбил проверку никому не нужной фичи.

Для тех, кому все кажется слишком сферическим, почитать на ночь сказку.

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

Ну и хотелось бы, чтобы разработчики интерпретатора уделили больше внимания скорости работы языка

Сложновато будет этого достигнуть, учитывая архитектуру реализации интерпретатора.
Впрочем это «поверхностное» суждение.
Основано на чтении статей об internal архитектуре представления объектов, ....

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

А корутины на генераторах тебя не смущали? А как стринги в 3.0 сломали, не дав ничего взамен?

Я бы на 2.7 остался, если бы это возможно было.

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

А проморгать в рукописном коде доступ к чужому _foo — довольно трудно.

Я бы так не сказал: person_name = person._name.

Если бы в питоне подчёркивание использовалось только для приватных методов - другой разговор. А так - абсолютно сливается с остальным кодом, имхо.

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

Ты втираешь дичь. Я уже сказал, что с такими делают в приличном обществе. Решение несуществующей проблемы да так, что код читать становится невозможно, браво.

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

f'Hello world {n=}.'

Какая жесть, так испоганить все надо уметь.

Кстати, а меня конкретно этот момент приколол. Для отладочных логов, или там для toString(), или для throw new Exception(«assertion failed for ...»), мне бы в жаве такая фигня пригодилась бы.

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

А если так:

if (std::lock_guard<std::mutex> lg {my_mutex}; condition) {
    // Mutex заперт
}

Так вроде в Си делать нельзя было. Фишка не в использовании присваивания, а в области видимости объявляемой переменной.

Deleted
()
Ответ на: комментарий от Manhunt

Меньше скобок => легче читать

со скобками оно как-то вписывается в естественную математико-алгебраическую нотацию.

if (a = f(), a > 0)

ни во что разумное не вписывается, выглядит маразматически и ничем не лучше

a = f() if (a > 0)

на порядок снижает читабельной, ничего не давая взамен.

Уже это

if ((a = f()) > 0)

имеет смысл только для ввода локальных переменных условий и циклов. Потому что запись ломает хронологию сначала идёт присваивание, а потом сравнение. Визуально же сначала идёт сравнение, а потом присваивание.

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

Фишка не в использовании присваивания, а в области видимости объявляемой переменной

Так это нужно делать не «экспромтом», а сначала например подумать над тем -
«Каков должен быть синтаксис, позволяющий изменить область видимости переменной?».
Критикую := потому, что явно «дилетантский» подход к проектированию архитектура языка программирования.

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

Решение несуществующей проблемы

в твоем уютненьком микромирке из хелловорлдов и гцц нет вообще никаких проблем.

код читать становится невозможно

не можешь распарсить 0>a иди в дворники. Там ты найдешь приличное общество (тм), которое будет соответствовать твоим непритязательным вкусам.

Асимметричная реализация оператора == в плюсах - не, не слышал? Нубы наговнокодили? Угу, угу. Microsoft's _bstr_t не так давно этим страдал, как сейчас не знаю. Короче, склихасофский, мне лень разжевывать.

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

Стабильность хоть какая-нибудь будет, не?

не, коллективы должны постоянно выдавать «новьё», чтобы оправдывать своё существование. Уже давно главный мотив появления «новья» - это оправдание расходов на коллективы.

Ну и обязательно надо постоянно ломать совместимоть (и прямую и обратную), чтобы невозможно было пользоваться «старьём» ... в котором ещё нет зондов и облачного управления - это важно для корпораций и силовых меньшинств.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.