LINUX.ORG.RU
ФорумTalks

Читаемость генераторов, развесистых лямбд и прочий write-only код...

 , , , , функциональщина


0

4

Тут немножко конвертирую HTTP заголовок в dict заголовков для requests.

{x.split(': ')[0]:x.split(': ')[1] for x in header.split('\n') if ': ' in x}
- вполне годный генератор, делает то, что мне нужно, но, сцуко, ПОЧЕМУ ЭТОТ КОД ТАК ОТВРАТНО ВЫГЛЯДИТ???? Почему среди тупого, как паскаль Вирта, кода какая-то обратная польская запись или написанный Йодой код? Я не хочу джедаить, я хочу ровно писать код, как рисовать диаграммы.

Почему нельзя сделать генератор, похожий на

dict = (
    while
        x=get(header.split('\n'))
        return(x.split(': ')[0]:x.split(': ')[1])

)
или типа того? Или это мне пора учить лисп? В sql есть подзапросы, почему вместо лямбд и генераторов не делать «подпрограммы» посреди кода?

★★★★★

Последнее исправление: Shadow (всего исправлений: 2)

Потому что дизайнером языка был, к сожалению, не Вирт.

А вообще, в чём проблема написать без генератора? Создаём переменную, запускаем цикл, внутри делаем проверку, записываем…

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

Почему нельзя сделать генератор, похожий на

И где здесь проверка, которая в оригинале if ': ' in x?

Если без неё, то те же яйца, только в профиль. Как по мне, примерно одинаково [не]читаемо.

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

dict(x.split(": ", 1) for x in header.split('\n'))
CrX ★★★★★
()
Последнее исправление: CrX (всего исправлений: 2)

пора учить лисп?

Да. Твоё время пришло.

(->> (-> "Foo: Bar\nContent-Type: application/json\n"
         StringReader.
         BufferedReader.)
     line-seq
     (map #(split % #":\s+"))
     (into {}))

;; {"Foo" "Bar", "Content-Type" "application/json"}
Nervous ★★★★★
()
Последнее исправление: Nervous (всего исправлений: 1)

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

А вообще у тебя там целых два бага.

cookie:a=b: c: d

Правильно это парсить как заголовок Cookie, в котором передана переменная a, равная b: c: d, а у тебя оно распарсится в заголовок cookie:a=b с содержимым c, а последние 3 символа вообще потеряет вникуда.

firkax ★★★★★
()

1:

dict(x.split(': ')[:2]for x in header.split('\n')if ': ' in x)

может прежде пора учить лишп откуришь пихон всёж?

qulinxao3 ★☆
()

Или это мне пора учить лисп?

Пора учить Ruby.

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

str.partition(': ') так шта:

{l:r for l,_,r in(x.partition(': ')for x in header.split('\n'))if r}

и повторюсь ТС питон не до душил

:)

qulinxao3 ★☆
()
Последнее исправление: qulinxao3 (всего исправлений: 3)
Ответ на: комментарий от Shadow

Какая разница? Я для примера привёл, можешь любое другое название заголовка подставить. У тебя некорректно обрабатываются пробелы (которых после двоеточия может быть любое количество начиная от нуля, а так же вроде и до разрешены) и некорректно обрабатываются двоеточия в значении.

firkax ★★★★★
()

ПОЧЕМУ ЭТОТ КОД ТАК ОТВРАТНО ВЫГЛЯДИТ

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

Почему нельзя сделать генератор, похожий на

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

no-such-file ★★★★★
()
Ответ на: комментарий от qulinxao3

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

usi_svobodi
()

Да вроде более-менее читаемо. Хотя может это codewars меня испортил (: Хочешь ясности, напиши в три строчки

d = {}
for x in header.split('\n'):
    if ': ' in x: d[x.split(': ', 1)[0]] = x.split(': ', 1)[1]

или ваще

d = {}
for x in header.split('\n'):
    if ': ' in x:
        k, v = x.split(': ', 1)
        d[k] = v
MrClon ★★★★★
()
Ответ на: комментарий от Nervous

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

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

ЛИСП же вообще синтаксиса не имеет, одни списки

Формы. Есть формы простые, есть составные. И это не обязательно списки.

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

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

Nervous ★★★★★
()

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

bread
()
headers = [[Server: QRATOR
Date: Wed, 29 Oct 2025 21:41:07 GMT
Content-Length: 0
Connection: keep-alive
Keep-Alive: timeout=15
Location: https://www.linux.org.ru/]]

results =  {            }
pattern = '(.-):%s+(.-)\n'

-- почему типа такого не написать?
for k,v in headers:gmatch(pattern) do
    results[k] = v
end

-- или можно типа такого
headers:gsub(pattern,function(k,v)
    results[k] = v
end)

Это Lua если что, но наверняка можно тож самое в питоне мне кажется вот это {for x in blabla} создано для генерации простых данных типа как в баше {1..100} и типа того, но не для впихования туда всего и вся, разбей операции на последовательности и всё будет читаться нормально ^.^ тююю

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)
Ответ на: комментарий от Shadow

хорошо быть не читаемым

см выше партишин

x,y=text.split(delim,1) требует наличия delim чтобы не сломаться

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

dict(a[::2]for a in (
            x.partition(': ')for x in header.split('\n')
     )if a.__len__()>2
)
qulinxao3 ★☆
()
Последнее исправление: qulinxao3 (всего исправлений: 1)

ваще если в мире достоверно валидных данных то

from ast import litera_eval as eval
dict_=eval('{'+header.replace(': ',': "').replace('\n','",')+'}')

синтаксис контейнеров клч:знач же эволюци даг

qulinxao3 ★☆
()
Последнее исправление: qulinxao3 (всего исправлений: 5)
Ответ на: комментарий от LINUX-ORG-RU

см ^

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

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

Вот что значит старость. Забыл, что масив в хеш можно напрямую запихнуть.

my %dict =  map { split /:\s+/ }  grep /:\s/, split /\n/,$headers;

vel ★★★★★
()

Прочитал как whites-only code. Кстати, было бы прикольно

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

или дубовее:


def gen(l):
    for x in l:
          if len(a:=x.partition(': '))==3:
              yield a[::2]
res=dict(gen(header.split('\n'))

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

А вообще, в чём проблема написать без генератора?

По крайней мере раньше, генераторы в python были предпочтительнее циклов, потому что виртуалка их обрабатывала не как циклы и делала это быстрее.

skiminok1986 ★★★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.