LINUX.ORG.RU

PEP 0448 — Additional Unpacking Generalizations

 


0

3

Теперь в моём питоне можно делать вот так:

>>> function(**kwargs, **more_kwargs)

И вот так:

>>> for user in anonymous, *registered_users:

И всяко-разно:

>>> *range(4), 4
(0, 1, 2, 3, 4)
>>> [*range(4), 4]
[0, 1, 2, 3, 4]
>>> {*range(4), 4}
{0, 1, 2, 3, 4}
>>> {'x': 1, **{'y': 2}}
{'x': 1, 'y': 2}

Что, сучечьки, кто-то ещё противится переходу на Python 3?

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

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

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

Ну да, это ж учиться надо...

Кстати, а свой код тебе писать еще не доверяют?

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

Кстати, а свой код тебе писать еще не доверяют?

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

Вот неплохая статейка http://habrahabr.ru/post/140581/, там конечно не про «паттерн манкинг» но суть ясна - пиши нормальный код и будет тебе добро.

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

Кстати, а свой код тебе писать еще не доверяют?

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

Я спросил про тебя, именно лично про тебя. Чужого кода я видел немало, но кода, испорченного паттерн матчингом, не видел вообще.

Вот неплохая статейка http://habrahabr.ru/post/140581/, там конечно не про «паттерн манкинг»

конечно не про «паттерн манкинг»

Мде. Наверное, это должно подразумевать, что паттерн матчинг - нечто дофига сложное? фейспалм.

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

Мде. Наверное, это должно подразумевать, что паттерн матчинг - нечто дофига сложное? фейспалм.

Как нечто дофига не нужное. Особенно в питоне.

но кода, испорченного паттерн матчингом, не видел вообще.

Ну дай уже красивый примерчик

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

Уже привели код, где паттерн-матчинг вывозит(про битторрент который). Питоновского аналога на if-ax правда так и не показали.

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

function my_print(str, o) {
console.log(str+(o&&o.end||«\n»))
}

вообще-то это НЕ эквивалент для описанного выше(*) .

выше(*) было сравнение с undefined . а ты написал сравнение с пустой строкой.

и еще 100-ю способами

вот для этого и ввели в Python нормальный синтаксис.. чтобы всякие макаки не выдумывали бы 100 забагованных способов (или не забагованных, но зато безжалостно удлинняющих код).

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

но зато безжалостно удлинняющих код).

По факту, обилие сахара неизбежно приведет к удлиннению кода, причем фатальному. Это аксиома. Сахар укорачивает код только на синтетических примерах, это аксиома. Хорошо еще, когда есть возможность его не использовать просто.

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

> а ты написал сравнение с пустой строкой.

Ничего подобного, undefined точно также приведется к false.

var s = ''

if (s === undefined) {
  console.log('я макака, если думаю что увижу это сообщение')
}

ещё какие комментарии дополнительные — требуются? :-)

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

У тебя строгое сравнение. замени его на ==, и не позорься, в следующий раз, не рассуждай о языке, когда даже основы ниасилил

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

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

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

Тут твой код вообще, кстати, не при чем. Смысл в том, что

""||console.log("fuck")
false||console.log("fuck")
undefined||console.log("fuck")
выполниться с тем же результатом

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

перечислены пункты, которые надо реализовать.

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

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

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

С чего это вдруг? Приведен валидный пример паттерн-матчинга, в ответ на него вывалено непонятное что-то.

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

Ну вот вполне конкретный код, парсящий IPv4 датаграмму:

-define(IP_VERSION, 4).
-define(IP_MIN_HDR_LEN, 5).

DgramSize = byte_size(Dgram),
case Dgram of 
    <<?IP_VERSION:4, HLen:4, SrvcType:8, TotLen:16, 
      ID:16, Flgs:3, FragOff:13,
      TTL:8, Proto:8, HdrChkSum:16,
      SrcIP:32,
      DestIP:32, RestDgram/binary>> when HLen>=5, 4*HLen=<DgramSize ->
        OptsLen = 4*(HLen - ?IP_MIN_HDR_LEN),
        <<Opts:OptsLen/binary,Data/binary>> = RestDgram,
        io:format("~w: ~w~n", [Opts, Data])
    end.

Кофе варить не просит. Можно аналогичный на питоне используя только if-ы?

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

1. Может распарсить 11 типов сообщений

сколько будет веток, столько и типов сообщений, этот путкт ложен.

2. Проверяет корректность размера сообщения (на основе его тега)

это тупо засовывается в условие.

3. Создает соответсвующие структуры данных (конвертируя при необходимости big-endian в little-endian)

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

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

сколько будет веток, столько и типов сообщений, этот путкт ложен.

Ну так сделай это

это тупо засовывается в условие.

Засунь в условие

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

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

Ну так где код?

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

Ну дай уже красивый примерчик

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

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

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

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

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

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

Открой русско-английский словарь, и ты откроешь для себя удивительную вещь

Не

Ты не сможешь реализовать сопоставление с образцом с помощью условных ветвлений?

Я могу и любой может. И какой вывод ты из этого делаешь?

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

Ты не сможешь реализовать сопоставление с образцом с помощью условных ветвлений?

Но зачем, если можно в несколько раз короче, быстрее, надёжнее и читабельней?

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

Ты не сможешь реализовать

так речь не о «сможешь/не сможешь»

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

Я никуда никого не перетягиваю. Вопрос стоял так:

А семантическое то отличие от ифов, кондов свитчей и прочего в чем?

И я не пойму, неужели не очевидно, что:

is_valid_hdr(<<131:8, _/binary>>) -> true;
is_valid_hdr(Data) when is_binary(Data) -> false.

семантически не то же самое что:

is_valid_hdr(Data) when is_binary(Data), byte_size(Data) > 0 ->
    Tag = binary:at(0, Data),
    if
        Tag == 131 -> true;
        true -> false
    end.

хотя логически два варианта эквивалентны.

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

Я могу и любой может. И какой вывод ты из этого делаешь?

тот самый, с которого начинался спор. Паттерн-матчинг — это сахар над ветвлениями. Никакой особо большой семантической роли, кроме небольшого сокращения кода, он не играет.

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

Но зачем, если можно в несколько раз короче, быстрее, надёжнее и читабельней?

ты платишь за это усложнением синтаксиса.

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

Я могу и любой может. И какой вывод ты из этого делаешь?

тот самый, с которого начинался спор.

Какой спор? Я спорил с персонажем, который сначала утверждал, что паттерн матчинг - излишнее усложнение, потом - что это круто и модно, потом - что это не нужно. С анонiмусом я не спорил.

Паттерн-матчинг — это сахар над ветвлениями. Никакой особо большой семантической роли, кроме небольшого сокращения кода, он не играет.

анонiмус, залогинься.

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

Это смотря с какой стороны посмотреть. Язык можно построить и только на базе паттерн-матчинга и рекурсии (с TCO), так не будут нужны if/do/while/for/foreach/break/continue/goto/etc.

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

ты платишь за это усложнением синтаксиса.

Омг, неужели вот это:

{A, B, C, D} = Tuple.

сложнее чем:

A = element(1, Tuple),
B = element(2, Tuple),
C = element(3, Tuple),
D = element(4, Tuple).
NegatiV
()
Ответ на: комментарий от NegatiV

Да. Ввод новой сущности, тем более на уровне синтаксиса, это усложнение. Усложнение синтаксиса, это не то, о чем ты думаешь. это не то, насколько коротко ты можешь написать то или иное выражение.

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

Да. Ввод новой сущности, тем более на уровне синтаксиса, это усложнение. Усложнение синтаксиса, это не то, о чем ты думаешь. это не то, насколько коротко ты можешь написать то или иное выражение.

А где ввод новой сущности и усложнение? Кортеж создается как {1, 2, 3, 4} и точно этим же синтаксисом матчится.

Tuple = {_A, _B, _C, _D} = {1, 2, 3, 4}.
NegatiV
()
Ответ на: комментарий от mix_mix

кстати, сомнительно, что

break/continue/goto

можно реализовать только лишь

на базе паттерн-матчинга и рекурсии (с TCO)

поскольку нет нелокальных выходов.

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

А различает он просто: если хоть одна переменная в выражении «=» связаная (ей было дано значение), то это паттерн-матчинг.

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

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

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

Для ифа нужна еще лень

Лень нужна для *функции* if', сопоставлению же зачем?

кстати, сомнительно, что break/continue/goto можно реализовать

Прекрасно реализуется косвенной рекурсией.

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

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

Ну так реализуй паттерн-матчинг в С.

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

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

Это ты про Схему или про Брейнфак? :D

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