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)

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

Ничем не лучше, на мой взгляд даже хуже и конечно в плюсах так можно.

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

у питона изначально говённый дизайн

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

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

А чем if (a = f(), a > 0) лучше if ((a = f()) > 0)? Или в плюсах так нельзя?

И так и так хреново.

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

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

if (a = f(), ad > 0)
А потом судоржно соображать почему у нас условие перестало срабатывать. Вообще первый вариант ужасен, результат первого оператора никак не используется а используется лишь содержимое переменной. Так и надо тогда присваивание делать до оператора а не пихать внутрь бесполезную сущность.

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

На скобки пофигу, чтение они не усложняют

В глазах рябит же, пока вычитаешь, какая скобка к какой является парной.

Мы не сможем, исправляя код, ошибиться и записать «if (a = f(), ad > 0)»

С моей колокольни, на такое должны линтеры ругаться.

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

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

Ух ты! А операторные скобки (пусть не в паскалевском стиле, пусть в сишном) не завезли, чтобы невидимые символы не считать? Меня в питоне этот ССЗБ-синтаксис с отступами вместо скобок больше всего вымораживает.

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

А операторные скобки (пусть не в паскалевском стиле, пусть в сишном) не завезли, чтобы невидимые символы не считать?

Действительно, нахрена нужны отступы, если можно увлекательно провести время за выискиванием скобок?

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

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

Ну так Snap или Flatpak c нужным питоном внутри и проблема решена!

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

Извини, в развёрнутой не могу. Вообще, если тебе поспорить, то сразу скажу, что у меня нет неоспоримых аргументов.

А так, куча мелких признаков. Типа вот этих кракозябр в определении функций. Типа операции матричного умножения, зашитой в язык (при том, что самого типа матрица в языке нет, только в библиотеках). Типа вот этого `:=`, из-за которого Гвидо сбежал, окончательно махнув рукой на своё творение.

Можно, наверное, ещё кучу подобных несообразностей накопать, но мне противно в этом копаться. Питон образца конца 90-х / начала 2000-х был неплохим простым языком для обучения и написания несложных скриптов. Но для того, что из него пытаются сделать последние 10-15 лет, он явно не был предназначен.

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

Типа вот этого `:=`, из-за которого Гвидо сбежал, окончательно махнув рукой на своё творение.

То есть бомбануло не только у меня? Слабое, но всё-таки утешение.

куча мелких признаков. Типа вот этих кракозябр в определении функций. Типа операции матричного умножения

Это скорее вектор развития. Направление, в котором ползёт коллективное бессознательное. Если это всё не повводили бы, то претензий к изначальному дизайну питона у тебя не было бы?

Извини, в развёрнутой не могу. Вообще, если тебе поспорить, то сразу скажу, что у меня нет неоспоримых аргументов.

Мне ознакомится с чужим мнением, логикой и аргументацией. Задачи кого-то непременно переспорить нету :)

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

И правда, раз уж всё равно синтаксис в кашу превращают, то добавили бы уже опциональные операторные скобки для ценителей. Всего-то нужно добавить несколько ключевых слов типа `enddef`, `endif`, `endwhile` и т.д.

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

В общелиспе самая мощная система аргументов что я знаю, грамматика такая:

lambda-list::= (var* 
                [&optional {var | (var [init-form [supplied-p-parameter]])}*] 
                [&rest var] 
                [&key {var | ({var | (keyword-name var)} [init-form [supplied-p-parameter]])}* [&allow-other-keys]] 
                [&aux {var | (var [init-form])}*])
loz ★★★★★
()
Ответ на: комментарий от A-234

Вы присваивание потеряли, код не эквивалентный.

Это догадки. В этих однострочниках вообще нет никакой инфы о том, что там за f(), что за а, что с чем и почему сравнивается. Если ориентироваться только на ту инфу, что доступна из однострочника - код эквивалентен.

С некоторой вероятностью даже за if(0 < f()) нужно отрубать руки по самые ягодицы. Но тоже не факт.

Да и смысл изначальный в другом - нефиг проверку условий перегружать до степени невменяемости. И переменную тебе тут объяви, и присвоение, и проверку, и ча-ча-ча сплясать. Главное потом фуагра не подавиться, когда придется все это сопровождать.

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

Приватных членов нет, костылизация через подчёркивания — примерно позапрошлый век.

А что не так с подчёркиваниями? [За исключением того обстоятельства, что ССЗБ могут их игнорировать]

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

Если это всё не повводили бы, то претензий к изначальному дизайну питона у тебя не было бы?

Когда в 97-м (или в 98-м, не помню точно) я нашёл питон, то у меня не было претензий. Наоборот, я подумал что вот, наконец-то, простой и понятный язык для скриптинга. ;)

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

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

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

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

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

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

Чтобы было понятно что это просто функция с еще одним аргументом

>>> class A(object):
...   def f(self, x):
...      return self.a + x
...
>>> a=A()
>>> a.a = 8
>>> A.f(a, 5)
13
vertexua ★★★★★
()
Ответ на: комментарий от anonymous

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

Ок. В таком виде твоя позиция понятна.

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

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

if(x == y):
  x = 10
  if(y == 6):
    y = 9
  pass  
pass

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

За исключением того обстоятельства, что ССЗБ могут их игнорировать

Вот как раз это. Я не из тех кто будет кричать «где мое ключевое слово private, я люблю печатать длинный код и потом все равно называть переменные pvtFoo, foo, foo или что-то в этом духе». Но могли бы честно говоря и запретить вызывать private поля. В Go вон тоже регистр первой буквы определяет видимость. Но и компилятор это понимает и следит за этой видимостью

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

Было бы каррирование, вообще было бы круто, но нет. Немного раздуто вместо этого нужно использовать partial()

>>> from functools import partial
>>> af=partial(A.f, a)
>>> af(2)
10
vertexua ★★★★★
()
Ответ на: комментарий от vertexua

В Go вон тоже регистр первой буквы определяет видимость.

Угу, как по мне - вполне нормальное решение (что регистр, что подчеркивание).

Но и компилятор это понимает и следит за этой видимостью

Какую проблему это решает? Проблему обезьян, которые бездумно игнорируют вообще всё вокруг, лишь бы код работал здесь и сейчас? Так если с головой настолько всё плохо, никакими техническими средствами это не лечится.

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

Пока это все теория, есть ли реально ФП системы на питоне которые используют эту фичу? Или по-другому какой смысл заводить ФП и встраивать в него объектную систему в не-ФП языке?

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

Обычно просто когда клеят разные библиотеки с разными стилями. Когда где-то нужна функция, а есть метод.

Еще другой случай, немного не такой, когда два стиля кляется - это то, что self умеет частичное применение. Вот тут я не совсем точно написал

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

Можно было просто

>>> af=a.f
>>> af(10)
18

Но это только для self

vertexua ★★★★★
()

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

Это просто уродливо.

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

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

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

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

Проблему обезьян, которые бездумно…

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

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

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

Иногда это лечится import from_future. Или что-то такое, я не шучу, с printf в 2.7 прокатывало.

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

Но скачает обновление пользователь дебиана

А там требование >=python-3.8.0

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

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

Я бы не назвал техническое решение - легким. Тут ведь на другой чаше весов лежит гибкость. Есть случаи, когда доступ к приватным членам извне — желателен. Скажем, в коде юнит-тестов. В прототипах наколеночных (когда по итогам прототипирования ты как раз намерен периначить интерфейсы).

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

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

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

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

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

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

Оператору вообще все пофиг, девелоперу - нет. Во-первых, сразу видно сравниваем с чем. Во-вторых, при сравнении вида 0==а нет шанса наступить на известные нам с детства грабли if(а=0). В-третьих и в случаях типа < > пишут так же, апатамушта хоть безобразно, зато однообразно.

В микромирках хелловорлдов это, конечно же, не имеет значения.

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

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

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

Есть случаи, когда доступ к приватным членам извне — желателен. Скажем, в коде юнит-тестов.

Вот это холивар размером с tabs vs spaces, vi vs emacs.

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

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

не тьюринг-полное дерьмо. уже дошло до того, что совместимость ломается в минорных версиях. раньше хоть 2 и 3 были не совместимы, теперь вообще не понятно на какой версии этот код будет работать, а на какой не будет. #!env python3.8 во все поля наверное, и 3.7 тоже рядом поставить для совместимости.

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