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)

Нет, нет, нет! Пока не привезете var, const и фигурные скобочки для блоков - все равно не полюблю!

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

Switch-case в этом плане ничего нового не даёт.

И как через этот if-elif написать

switch(f(1, 2, 42, 100500)) {
  case 1:
  case 5:
    do1();
    break;
  case 10:
    do2();
    break
  default:
    do3();
}

?

monk ★★★★★
()
def f(a, b, /, c, d, *, e, f):
    print(a, b, c, d, e, f)

«Positional-only аргументы» — выглядит очень убого в коде, я вообще не приветствую обилие спецсимволов.

лучше бы реализовали декоратором — было бы намного проще читать

@positional_only(a, b)
@keyword_only(e, f)
def f(a, b, c, d, e, f):
    print(a, b, c, d, e, f)

или с помощью тайпхинтов

from typing import Positional, KwArg, Any

def f(a: Positional[str], b: Positional[int], c, d, e: KwArg[Any], f: KwArg):  # (KwArg is KwArg[Any])
    print(a, b, c, d, e, f)
actionless ★★★★★
()
Последнее исправление: actionless (всего исправлений: 3)
Ответ на: комментарий от anonymous

Есть «разработчики» и есть «новаторы».

Есть «разработчики» и есть: «новаторы», „рационализаторы-конструкторы“, „затейники“, „массовики затейники“, ...

Владимир

anonymous
()

Ну вы поняли, от т.н. сути питона не осталось и следа, теперь это более худший перл.

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

и замечу, что стало намного читабильнее и элегантней :)

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

Скажем сразу, partial выглядит по-максимуму убого, любой cut лучше, но cut с плейсхолдерами из srfi-26 не портировали и портировать не будут, потому что настоящие питонисты™ этим не пользуются.

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

«Кипит мой разум возмущенный».

«Хааачу» goto ExpressLabel.
Пользоваться так:
- В какой-то массив помещаем ссылки на метки;
- ...

Вообщем - «автоматная таблица».
В простейшем случае она может быть === «case» или «if ... else» ...

Владимир

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

Не к тому, что if или case «не нужны» ... /а то поймут «не так»/.

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

Сколько будет с использованием этой штуки ребусов понаписано :(

А вот это точно)

Twissel ★★★★★
()

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

Сцуко, это должно было быть в версии 1.0.

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

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

Каждый релиз пистона вызывает подобные фейспалмы. Думаешь: и как они раньше без этого жили. Ждем теперь к 4-й версии switch лол.

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

А я в этом случае предпочитаю, по старинке, отдельное присваивание:

foo = f(1, 2, 42, 100500)

if foo in [1, 5]:
   do1()
elif foo == 10:
   do2()
else:
   do3()

Лично мне кажется, что так читаемость легче. А это я ценю больше, чем экономию одной строки из семи.

И, в обоих вариантах, if-elif-else красивее, чем тот switch-case-case-break-default.

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

Кого бесят висячие строки и вообще хочет писать на питоне как на си могут писать так

Ты же понимаешь, что никто так писать не разрешит. Хотя я встречал промышленный код с #end, но это тоже бред, и прокатывало в давние времена когда над душой не висели линтеры и ревьюеры. А главное, это чисто косметическая фигня не решает проблемы, код остается таким же хрупким.

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

Переусложненность не нужна

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

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

Мне очень любопытно, какой стиль скобок вы предпочитаете?

Первые два выглядят вполне годно, особенно Allman. Да и в любом случае, _большинство_ стилей из той таблицы лучше, чем питоноужас, где работа программы зависит от невидимых (!) символов.

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

Лично мне кажется, что так читаемость легче. А это я ценю больше, чем экономию одной строки из семи.

Разработчики компиляторов услышьте «чаяния народа».

Шутка ИМХНО там где код «каша-малаша» компилятор должен отказывать в его компиляции.
И сообщать руководителю предприятия, что у программиста в голове «каша-малаша».

Владимир

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

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

man statement vs expression

В первом случае можно написать, например, так:

if (int foo = 42, bar = 24; f(foo, bar))

Во втором случае это у тебя тупо compound expression, и ничего объявлять ты там не можешь.

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

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

Если речь о присваивании в логическом выражении, то не всегда. GCC, судя по моим экспериментам, показывают предупреждение только в самом примитивном случае, а выражение как в той уязвимости в wait4 проглатывает, не подавившись.

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

_большинство_ стилей из той таблицы лучше, чем питоноужас

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

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

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

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

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

Замечено: проблемы с отступами в питоне как правило у тех, кто на питоне не пишет :D

Haskell, F# - тоже учебный исполняемый псевдокод?

anonymous
()

помянем

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

Буду признателен если приведете код который GCC проглатывает не ругаясь. У меня как начались варнинги в безобидных

if (x = f())
так вечно приходится на подобных строчках parentheses отключать потому как разработку веду естественно с Wall.

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

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

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

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

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

Скобочки есть, точки с запятыми есть, нужно писать в одну строку.

Совершенно дурацкий вывод. Но ты можешь писать в одну строку, никто не запрещает.

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

На сколько я понял, скобки вокруг выражения с присваиванием «успакаивают» -Wall. Пример того, как «дом может гореть по плaну» был продемонстрирован по ссылке от анонимуса:

Релиз Python 3.8 (комментарий)

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

seiken ★★★★★
()

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

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

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

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

ну вообще да, если в питон завести скобки, то киллерфича будет утрачена, так и коммунити можно развалить

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

твоя правда, спасибо

Иннокентий

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

Бред. Фича нужна, чтобы код был единообразный, а не то, что вы там себе нафантизировали. Плюс это избавляет от объективно лишнего синтаксического мусора.

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

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

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

ты ведь все факторы учёл(?),впрочем как скажешь, гуру дизайна

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

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

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

ты часом не питониста, в коде они обычно перфекционисты

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

Фича нужна, чтобы код был единообразный

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

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

Те в emacs эта фича для говнокодеров? Когда прочитал очередные «правила хорошего кода» и теперь Про.

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

На счёт выравнивания - скобки ему никак не мешают, а даже помогают, речь естественно об автовыравнивании

Можно и без скобок, лишь бы был маркер конца блока. Питон в этом отношении самый дурацкий ЯП в мейнстриме. Там есть символ начала блока - то самое двоеточие, которое постоянно забываешь, а конец блока невидимый. Это же натуральная шиза. При этом не сказать, что в питоне мало скобочек, их там дохренища всяких видов, а внутри скобочек возможна любая содомия. Гениальный дизайн.

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

Кто-то же должен заплатить за нелюбовь Гвидо к лиспу

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