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

I won't pretend to remember Lisp inventor John McCarthy's exact words which is odd because there were only about ten but he simply asked if Python could gracefully manipulate Python code as data.

«No, John, it can't,» said Peter and nothing more, graciously assenting to the professor's critique, and McCarthy said no more though Peter waited a moment to see if he would and in the silence a thousand words were said.

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

И потом эти люди рассказывают нам

Это разные люди. Я фишками из последних стандартов почти не пользуюсь, ибо по работе куча легаси.

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

Не заметил как оторвал лишний таб у следующей строки и она оказалась не под условием.

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

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

Сложно допустить ошибку в отступе — ты её сразу видишь. Куда легче пропустить скобку, или подумать, что она тут не нужна (см.пример раньше).

Случайно скобку убрал - и у тебя на глазах весь блок кода смещается. Сразу видно проблему.

Именно! Проблему замечаешь не по отсутствию скобки, а по изменению отступов.

Об этом и речь — даже со скобками люди давно ориентируются по отступам.

И в скобочных языках цепочка выглядит как-то так:
1. расставили отступы И скобки
2. запустили автоформаттер
3. посмотрели на оступы
4. если отступы изменились из-за неверных скобок — исправили скобки, goto 2.

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

Автоформатирование сейчас вообще-то развилось до юзабельности.

Автоформатирование — это решение проблем с расстановкой скобок. Зачем решать проблему, которую можно не создавать? Нет скобок — нет и проблем? 🙂

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

Люди из Google сообщали о многих случаях проблем с питоновским кодом, вызванных именно отступами. Например: https://talks.golang.org/2012/splash.article

Цитата: «We have had extensive experience tracking down build and test failures caused by cross-language builds where a Python snippet embedded in another language, for instance through a SWIG invocation, is subtly and invisibly broken by a change in the indentation of the surrounding code. Our position is therefore that, although spaces for indentation is nice for small programs, it doesn't scale well, and the bigger and more heterogeneous the code base, the more trouble it can cause.»

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

У нас такие же проблемы и в плюсах были: «я вот код скопировал оттуда, там он работал. Не понимаю, в чем дело»

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

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

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

Люди из Google сообщали о многих случаях проблем с питоновским кодом, вызванных именно отступами

Опять «многие случаи», и ни одного примера. Неужели так сложно показать код?

build and test failures caused by cross-language builds where a Python snippet embedded in another language, for instance through a SWIG invocation

Я такое описание не понимаю... У них были баги в их софтине, которая генерировала питонокод, и неверно ставила отступы?

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

Питонокод с отступами — он удобнее для людей. А машинам легче генерить скобочки. С этим не спорю.

Но из этого следует, что людям надо писать на питоне, а на сях пусть пишут роботы. 🙂

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

Но из этого следует, что людям надо писать на питоне, а на сях пусть пишут роботы.

«Люди на нужны! Слава роботам!» ⓒ С. Лем.

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

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

Впрочем, отступы как структурные элементы — не самая большая проблема этого языка и экосистемы в целом.

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

Все-таки, иметь доступ к результатам вычислений, проведенным в условиях — это очень удобно, оценил, покодировав на Котлине.

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

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

print $1 if /.../

Чего только не сделают, лишь бы на перле не писать

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

Программистам на стероидах, очевидно.

python

А вот кому сдался этот деградировавший перл?

anonymous
()

2019

отступосрач

Всё в порядке с миром.

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

ну хз. декларацию переменных в условиях можно было бы в сишечку завезти, вроде как это ничего не ломает. Во всяком случае не страшнее, чем декларация переменных в for.

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

А вот кому сдался этот деградировавший перл?

Вопрос, кстати, интересный...

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

Как вышло, что он выжил перл из скриптов, функциональщину из математики, даже потеснил плюсы/дотнет в гуе, и выбрался в веб?

Хотя, конечно, javascript ему не переплюнуть ­— в браузерах питоноскриптов никогда не будет.

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

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

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

Впрочем, отступы как структурные элементы — не самая большая проблема этого языка и экосистемы в целом.

Дело не только в питоне. Вопрос стоит шире. Например, если выпилить скобки из С++ — станет лучше, или хуже?

Конечно, для обратной совместимости, это будет опционально, например:

#pragma braceless

в начале файла будет указывать, что дальше вместо скобок будут оступы. Удобная ли это фича? Способствует ли она уменьшению числа ошибок или увеличению?

Я — за уменьшение. Потому мне так интересны контраргументы и примеры. Но никто не хочет приводить примеры. 🙁

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

Как вышло, что он выжил перл из скриптов, функциональщину из математики, даже потеснил плюсы/дотнет в гуе, и выбрался в веб?

Дешевая прототипизация. В 90% случаев прототипа достаточно.

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

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

Никаких проблем с простановкой двоеточия нет.

Есть проблема, хотя может будет несправедливо упрекать в этом Питон.

Когда переключаешься на Питон с VHDL забываешь про двоеточие и более того - после if лепишь еще then и после смотришь и тупишь, почему он на это ругается

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

Как вышло, что он выжил перл из скриптов, функциональщину из математики, даже потеснил плюсы/дотнет в гуе, и выбрался в веб?

Насчет математики понятно - вобрал в себя практически все численные методы, считай бесплатный Matlab в модулях numpy, scipy, там же прорва старых добрых фортрановских математических библиотек на которых считали еще на БЭСМ и ЕС ЭВМ.

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

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

Препроцессоры и кодогенерацию на коленаке используют сектанты безумные, так и запишем.

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

Генерировал программно код на питоне шеллскриптом. Индентил ручками.

На сиподобном языке я бы этот код склеил бы со своим и один поломанный отступ(смешение отступов) погоды бы не сделал. Даже больше, я бы мог генерировать код макросами из m4 (например) и вместо копипаста логики из одного генератора в другой делал бы генераторы модульными. А если очень надо, автоформатировал бы.

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

Вот тебе и вся суть питона: на тебе по максимуму огороженные батарейки, шаг влево, шаг вправо - расстрел.

пишут роботы

Вы нам ещё расскажите про ужасные perl с awk и про то, что шеллскрипты надо обязательно заменять объектно-ориентированной портянкой жирнее оригинала раза в три, с вкраплениями шелла. Я вот такое видел, даже разгребал.

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

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

Во-вторых, лучшее применение кодогенерации - создание таблиц данных из одного источника и преобразование бинарных данных в что-то, что может быть вставлено в код. Например, какие-нибудь коды сообщений, которые бы записывались в исходники прошивки устройства и одновременно в протокол софта, который с ним работает. Если тебе требуется генерация тысяч методов, то ты что-то делаешь не так. В частности, ссылка выше дана в контексте обсуждения Go - языка хорошего, но местами корявого, и кодогенерация ему в том числе нужна для компенсации нехватки дженериков.

Во-третьих, я нигде не говорил, что препроцессоры и кодогенерацию используют безумные сектанты. Безумным сектантством является (1) предъявление косяков своего кривого кодогенератора языку и (2) экстраполирование частного случая на всю область применения языка. Ну и использование средств не по назначению.

Из какого ПТУ вас таких выпускают, что все так плохо с логикой?

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

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

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

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

То, что в питоне их нет - хорошо.

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

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

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

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

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

In [1]: x = (lambda:
   ...: print("a");
   ...: print("b");
   ...: )
  File "<ipython-input-1-e44b19404d7f>", line 2
    print("a");
              ^
SyntaxError: invalid syntax
liksys ★★★★
()
Последнее исправление: liksys (всего исправлений: 1)
Ответ на: комментарий от liksys

Никто не заставляет тебя пользоваться сишечным препроцессором. Пользуйся m4. Кто-то вполне себе его использует.

банальной нехватки встроенных языковых средств

Что-то в питоне подобное есть, прямо налицо видно. Чего-то нет, а что-то (:=) есть и прямо доказывает нам то, что питон теперь просто перл для тех, кто боится перла.

лучшее применение

Ты, наверно, хотел сказать «единственное», но понял, что это не прокатит, поэтому решил рассказать про одно. А их много, на самом-то деле. Гуегенераторы, генераторы парсеров, IDL, тот же FFI со SWIG (ага, тысячи методов закопаны вот здесь, потому что твой любимый язычок без батареек отправится прямиком в помойку). Куча всего. Можешь обзывать меня ПТУшником прямо сейчас и рвать на себе волосы, потому что я банально генерировал классы для ORM из шелла. Я их уже достаточно формализованно описал в тексте, не на питоне, конечно. Стоило добавить пару вариантов немного приправленного ORM-клея и пришлось копипастить из-за вложенности. ORM, кстати, была отвратительной, проще было бы генерировать SQL, что я раньше и делал на шелле (подзапросы в глубину) и это было гораздо проще.

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

нигде не говорил

Но подразумевал.

косяков своего кривого

А я и не собираюсь писать полноценный кодогенератор. Я хочу, чтобы быстро и на том, что уже используют в других языках. Шелл, препроцессоры, вот это вот всё. Вместо того, чтобы писать правильный и корректный кодогенератор, учитывающий зуд в левой пятке BDFL, всяко лучше достать m4/шелл и уйти на язык без таких прибабахов, либо уйти на лисп.

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

экстраполирование частных случаев

Если частных случаев много, это уже не частные случаи. Это система.

Использование предметов не по назначению.

Это называется hacker culture. Зачем не помышлять о том, что можно использовать как-то иначе? У тебя на этом весь юникс вырос, ты можешь скрепить шеллом и не шелом кучу утилит, используемых «не по назначению» и оно будет работать.

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

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

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

Ой, что это тут у нас? Язычок с утверждениями и претензиями на мультипарадигменность. С тем, что делается в других языках как выражение (вызов функции), но у нас это утверждение. И в третьей версии мы только начали понимать, что выражения всё-таки нужны. Попутно забив язык синтаксическим мусором.

(lambda:(print(1), print(2))[1])()

Два действия за одну лямбду - это плохо, это гораздо хуже, чем одно! Никогда не делайте так, дети!

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

длиннее одной строки должна иметь имя
следует бить головой

Вы только что послушали человека, сетующего на сектантов.

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

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

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

Сложно допустить ошибку в отступе — ты её сразу видишь. Куда легче пропустить скобку, или подумать, что она тут не нужна (см.пример раньше).

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

Именно! Проблему замечаешь не по отсутствию скобки, а по изменению отступов.

Какая разница, как она бросается в глаза - ее видно.

И в скобочных языках цепочка выглядит как-то так:
1. расставили отступы И скобки
2. запустили автоформаттер
3. посмотрели на оступы
4. если отступы изменились из-за неверных скобок — исправили скобки, goto 2.

Нет. Человек пишет код и автоформатирование работает мгновенно.

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

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

Нет. Скобки используются для верификации семантики. И это основной смысл.

Автоформатирование — это решение проблем с расстановкой скобок. Зачем решать проблему, которую можно не создавать? Нет скобок — нет и проблем? 🙂

Нет. Автоформатирования - это решение проблемы с форматированием. Как ни странно.

И зачем нужно сейчас при наличии автоформатирования вводить форматирование в семантику языка - не понятно. Да никто и не вводит.

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

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

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

In [1]: x = (lambda:
   ...: print("a");
   ...: print("b");
   ...: )
  File "<ipython-input-1-e44b19404d7f>", line 2
    print("a");
              ^
SyntaxError: invalid syntax

Но могу поставить запятую:

>>> x = lambda:(
... print("a"),
... print("b")
... )
>>> 

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

Никто не заставляет тебя пользоваться сишечным препроцессором. Пользуйся m4.

Ну да, автотулз. Пусть там и остается. M4, как и многие древние языки, довольно убог и синтаксически коряв. Я по работе занимался выпиливанием этого говна мамонта и запиливанием вместо него питона + мако. Люди вздохнули с облегчением.

Что-то в питоне подобное есть

Что-то подобное - что? Давай конкретику, а не свои чувственные ощущения.

Чего-то нет, а что-то (:=) есть и прямо доказывает

Единственное, что доказывает введение := - это то, что в нем была потребность. Если бы ты писал на питоне, тебе она была бы очевидна. Язык развивается, в него добавляют фичи, которые нужны практикантам, а не теоретикам из ПТУ. Не понимаю, из-за чего у тебя полыхает?

Ты, наверно, хотел сказать «единственное»

Я хотел сказать ровно то, что сказал. У кодогенерации есть множество частных случаев. Бизон и лекс, скажем. А в случае гуев ответ вообще не так очевиден, потому что сейчас частой практикой стало использование языков разметки и динамического построения интерфейсов в рантайме (QML, вот это все).

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

брызганье слюной по поводу ПТУ

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

Так как мы уже выяснили, что генерация кода много где нужна

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

Но подразумевал.

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

То, что язык не может в дружбу с кодогенераторами

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

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

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

Понимаешь, моншер, мир - он не черно-белый. Нужно искать компромиссы.

Если частных случаев много

Оказалось, что их мало.

Это называется hacker culture

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

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

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

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

Вы только что послушали человека, сетующего на сектантов.

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

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

Это один конкретный частный случай. Ты все еще не можешь использовать все языковые конструкции внутри лямбды. Более того, это не то же самое, что выражения подряд - ты просто составляешь кортеж из результатов вычислений. А если тебе надо выполнить десять функций и обмазать их условиями? Финита. В питоне ты уже почувствуешь БОЛЬ, когда начнешь делать вот такую херню. Языки типа JS тебе это позволяют, хотя очевидно, что ты должен дать такой сложной функции имя.

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

Это обычная функция в этом «бейсике».

С очень неудобной записью.

Я имею в виду удобочитаемые лямбды в стиле Java, Groovy и Scala.

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

Это один конкретный частный случай.

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

А если тебе надо выполнить десять функций и обмазать их условиями?

Для условий есть Conditional Expressions.

В питоне ты уже почувствуешь БОЛЬ, когда начнешь делать вот такую херню.

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

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

Я бы согласился, если бы не одно НО. Ты не можешь использовать все конструкции языка. Скажем, ты не сможешь обработать исключение без того, чтобы предварительно не написать для этого костыль, и не сможешь создать, скажем, класс (просто абстрактно). Это два примера, которые мне вспоминаются сходу, полагаю, их намного больше. А раз лямбда не поддерживает группировку в блоки и точку с запятой - это не многострочная лямбда.

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

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

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

А раз лямбда не поддерживает группировку в блоки и точку с запятой - это не многострочная лямбда.

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

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

Не в любом месте языка можно использовать все его конструкции

Давай конкретизируем терминологию.

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

Если речь об использовании строчных операторов - да, она есть.

Если речь о произвольной группировке любых операторов (как в JS, например) - то ее нет.

Я придерживаюсь последнего. Впрочем, нет и не надо.

в лиспе?

Вероятно нет. Не знаю, я не пишу на лиспе.

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

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

Это да. Мне повезло писать в vim-е, а тут строчное выделение («Shift+v») выделяет именно строки. И есть вставка с сохранением форматирования («]p», «[p»). Неужели в других IDE всё так плохо?

Какая разница, как она бросается в глаза - ее видно.

Но если изменение отступов бросается в глаза, то откусывание пробела от строки == изменение отступа, точно так же бросится в глаза же?

Скобки используются для верификации семантики. И это основной смысл.

Э... если человек читает код по отступам, и ошибки замечает по изменению отступов, то выходит, что семантика — это отступы. А скобки — просто способ расставить отступы через ж...

Человек пишет код и автоформатирование работает мгновенно.

Стоп, это другое.

Во-первых, есть авто-отступы при наборе. И они тоже имеют лишний этап. Сравни, открытие блока:
• нотация allman-а: нажал Enter, открыл скобку, Enter (IDE добавило отступы)
• python: нажал двоеточие, Enter (IDE добавило отступ)

То же по закрытию блока:
• нотация allman-а: Enter, закрыл скобку, Enter (IDE сделало отступы)
• python: Enter, Backspace (IDE сделало отступ)

Это всё работает и для питона. И даже так, даже с IDE, питону нужно меньше действий.

Но в реальности так не бывает. Код пишется не линейно, с бумажки, а редактируется вперемешку. Скобки ставятся сразу, и между ними вписывается код. Или удаляются для компактности, если они больше не нужны. А потом мы добавяем/удаляем несколько строк, и весь код ломается.

Поэтому, во-вторых, есть авто-пере-форматирование — выделяешь кусок кода, жмёшь Ctrl+Alt+Shift+CapsLock+Tab и IDE перерасставляет все отступы по скобкам.

А потом смотришь на отступы: если оступы поехали — скобки были расставлены неверно, исправляешь, goto 2.

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

Автоформатирования - это решение проблемы с форматированием.

Всё верно, но каких именно проблем? В каких случаях используется автоформатирование? Если посмотреть глубже, то оказывается, что оно решает проблемы, вызванные скобками. А нет скобок — нет и проблем.

Но нахваливать программистам решения облегчающие жизнь непрограммистов и мешающие самим программистам...

Так а что мешает-то? Можно пример? Не в общем, а конкретный кусок кода, конкретная ситуация и вызванная им проблема?

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

Я имею в виду удобочитаемые лямбды в стиле Java, Groovy и Scala.

По-моему, таких не бывает.

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

А большие сложные лямбды не могут быть «удобочитаемы», во сколько строк их ни пиши.

Пример:

f = (lambda f:(lambda x:x(x))(lambda g:f(lambda x:g(g)(x))))(lambda f:lambda n:0+(n<2) or f(n-1)*n)

Можно переписать его на javascript:

var f = (function(f){return (function(x){return x(x)})(function(g){return f(function(x){return g(g)(x)})})})(function(f){return function(n){return n<2?1:f(n-1)*n}});

Можно автоформатировать в несколько строк:

var f = (function(f) {
    return (function(x) {
        return x(x)
    })(function(g) {
        return f(function(x) {
            return g(g)(x)
        })
    })
})(function(f) {
    return function(n) {
        return n < 2 ? 1 : f(n - 1) * n
    }
});

И всё равно хрен поймёшь, как работает этот код.

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

PS: это не какой-то специально переусложнённый говнокод. Наоборот, это самый простой Y-комбинатор, который мне удалось накостылять. Если кто-то сможет упростить эту лямбду — будет здорово.

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

Но если изменение отступов бросается в глаза, то откусывание пробела от строки == изменение отступа, точно так же бросится в глаза же?

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

Э... если человек читает код по отступам, и ошибки замечает по изменению отступов, то выходит, что семантика — это отступы. А скобки — просто способ расставить отступы через ж...

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

Так а что мешает-то? Можно пример? Не в общем, а конкретный кусок кода, конкретная ситуация и вызванная им проблема?

Мыло, мочало, начинай сначала?

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

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

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

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

Это как это? Как мой курсор незаметно попал за пределы интересующего меня кода, да ещё и что-то вырезал?

Постоянно помнить про это можно, после того как раз 5 нарвешься на такую проблему - начнешь. Но зачем лишний раздражитель?

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

При скобках у тебя просто оторвется скобка

Нет, при скобках у меня скобка вырежется в одном месте и вставится в другом. Мы же про копипаст? Или про что?

и синтаксис подскажет на проблему с семнатикой.

А это вообще как это?

Семантику можно повесить на отступы - как в python и сделали, но я говорил о верифицируемости

«Верифицируемость» — это проверка на совпадение. О совпадении чего с чем идёт речь?

Мыло, мочало, начинай сначала?

Да мы пока и не начинали. Давай я попробую: в питоне я могу перетаскивать строки туда-сюда, и даже vim может сохранять в них форматирование. Пример: https://i.imgur.com/Zwuoltm.gif Проблем нет.

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

Другой пример кусок кода присланный в письме. Физики не думают о том, что их почтовый клиент письма форматирует

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

Это — реальная проблема. И это — единственная проблема, которую я знаю. Но! Эта проблема создаёт неудобства, но не вызывает ошибок. Незаметить это — невозможно.

Общее замечание: Решение примененное разработичком python после него практически никто не применяет

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

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

Это как это? Как мой курсор незаметно попал за пределы интересующего меня кода, да ещё и что-то вырезал?

Это называется «включил дурака».

Смысла тут обсуждать дальше нет.

Нет, при скобках у меня скобка вырежется в одном месте и вставится в другом. Мы же про копипаст? Или про что?

Именно - и это почти 100% гарантия ошибок компиляции для компилируемых и сбой запуска для других.

При отсутствии сбоя огромный кусок кода поменяет выравнивание при автоформатировании.

«Верифицируемость» — это проверка на совпадение. О совпадении чего с чем идёт речь?

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

Конечно есть верятность, что здесь ты недопонял, но скорее всего и здесь «дурка включил».

О! Наконец-то!

Это не «О! Наконец-то!». Это проявление проблемы на которую «дурка включить» не получится. Но можно как ты «включить дурака» и сделать вид, что она только так и проявляется.

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

Тут все ясно, проявление себя во всей красе.

Дальше не интересно.

Будешь опять «дурака включать». Это нормально для фанатов языков.

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