БЕГЕМОТИКОВ МОЖНО! Войти !bnw Сегодня Клубы

https://i.imgur.com/FBPqS8B.png

Сегодня я принёс вам упражнение для разминки. Попробуем сымитировать что-то подобное реактовским компонентам на питоне. Без использования транспилера. Да, синтаксис будет не html/xml-ный, зато без транспилера — чистый питон. И чтобы всё динамически — ни о каких тегах и атрибутах рендерер не знает, можно использовать любые (то, что class_ отрендерился в class — просто strip´аем андерскоры, если есть, костыль, чтобы использовать зарезервированные слова).

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

Усложнённый вариант — сделать из el1(attr1='value1')['text1', el2(attr2='value2'), 'text2'] такое: el1[attr1:'value1', 'text1', el2[attr2:'value2'], 'text2']. Обращаю внимание, имена атрибутов записаны БЕЗ кавычек.

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

Сорь за код картинкой, лень аплодить + так наглядней ввод и вывод.

Рекомендовали: @krkm
#U5GE66 / @4077 / 1433 дня назад

без транспилера

А может, нахуй пойдешь?

#U5GE66/W0Y / @postman / 1433 дня назад

@postman Это что же, жсблядь закукарекала? :D Иди, наверни ещё 23 новых плагина для бэйбла.

#U5GE66/T44 / @4077 --> #U5GE66/W0Y / 1433 дня назад

@4077 lmao

#U5GE66/D8T / @postman --> #U5GE66/T44 / 1433 дня назад

Ну и, собственно, усложнённый вариант: https://i.imgur.com/vEgnbpa.png

Обратите внимание на дата-атрибут (data-some-value).

#U5GE66/IIG / @4077 / 1433 дня назад
@4077 Вот ето работает? def render(): href = "https://bnw.im/" value = "foo" return a['href':href, data-some-value:value, "bnw"]
#U5GE66/TSQ / @anonymous --> #U5GE66/IIG / 1433 дня назад
@anonymous s/'href'/href/
#U5GE66/4OI / @anonymous --> #U5GE66/TSQ / 1433 дня назад
Отправь пашкиным олимпиадникам, здесь кукаретников не уважают
#U5GE66/972 / @anarchy / 1433 дня назад

тут не хватает препроцессора PSX, лол

#U5GE66/UKP / @kerrigan / 1433 дня назад

@anonymous Не, ни value, ни data-some-value в этом случае не будут работать (ну ты понимаешь почему, ага). Если хочется именно так, придётся записать атрибуты строками: 'href':href, 'data-some-value':value.

Предполагается, что внутри рендер-метода ты не будешь юзать локальные переменные, переменные контекста/инстанса компонента доступны через отдельный объект (типа реактовского props), то есть как-то так:

return a[href:props.href, data-extra-context-value:ctx.value, 'bnw']

(props — атрибуты инстанса компонента (как-нибудь так, например, instance = MyComponent(href='https://bnw.im', ...), ctx — дополнительный контекст, типа rendered = instance.render(context={'value': 'foo'}))

#U5GE66/3O5 / @4077 --> #U5GE66/TSQ / 1433 дня назад

@anarchy > здесь кукаретников не уважают
Охуенно обобщил за весь бнв, спасибо!

Отправь пашкиным олимпиадникам

Прочитал как «я говнокодер-копипастер-стэковерфлоу, я не привык/не умею думать, поэтому, чтобы скрыть своё припекание из-за того факта, что я не могу решить эту теоретическую (не практическую) задачку (чисто на умение искать нестандартные решения/знание тонкостей языка), я огрызнусь и отправлю автора куда подальше».

#U5GE66/Y54 / @4077 --> #U5GE66/972 / 1433 дня назад
@4077 проиграл с элитки-кукарекника
#U5GE66/43Y / @anarchy --> #U5GE66/Y54 / 1433 дня назад

@anarchy Да ради б-га. Крысиным королём при этом остаёшься ты, не я.

#U5GE66/KYV / @4077 --> #U5GE66/43Y / 1433 дня назад
@4077 вот это сейчас обидно было
#U5GE66/WBW / @anarchy --> #U5GE66/KYV / 1433 дня назад
Хуета. Я как-то писал объект-маппер на xml с аннотацией типов, проверкой типов, поддержкой вложенности, рендеринг по требованию. Все кинуть не могу, но вот освновные куски на примере одного запроса. Реально запросов больше двух десятков и каждый объект позволяет изъебываться с ним, а впоследствии рендерится. https://paste.fedoraproject.org/paste/jU7YCjJAcGB2LVaHKmFDK15M1UNdIGYhyRLivL9gydE=
#U5GE66/HP4 / @je / 1433 дня назад
@4077 > я не могу решить эту теоретическую (не практическую) задачку (чисто на умение искать нестандартные решения/знание тонкостей языка) есть ли у вас минутка поговорить о господе нашем хаскеле кабальском
#U5GE66/LIU / @mugiseyebrows --> #U5GE66/Y54 / 1433 дня назад
@je > arg.split(' ') тупой штоле?
#U5GE66/YEZ / @anonymous --> #U5GE66/HP4 / 1433 дня назад
@anonymous Ты опять на связь выходишь? Очевидно, когда-то там было не ' ', а что-то другое, а после может быть вынесено в конфиг-хуйфиг, не нужно доебываться до явного указания желания программиста.
#U5GE66/B3S / @je --> #U5GE66/YEZ / 1433 дня назад
@je Ооо, классическая манька, если она что-то не может, значит, это "хуета". ------ Зачем ты это сюда притащил? Не увидел ничего интересного, обычный джуниоровский рабочий код. Зачем каждый раз парсить докстринги? Сплиты, регулярочки, яебал. Такие операции можно (и нужно) делать ровно один раз -- при запуске твоего приложения. Распарсить докстринги (фиг знает, зачем ты выбрал именно докстринги, а не нормальные структуры, но ладно, предположим, для докогенерации (хотя, опять же, я бы докстринги по структурам генерил, а не наоборот)) и сохранить полученное описание в нативных питоновских структурах (дикты, листы, что угодно). А так у тебя на каждый вызов `to_xml()` проделывается эта работа. Зачем каждый раз файл темплейта перечитывать, опять же. Сделай его кэшированной пропертёй, читай один раз при первом обращении. > `app_logger.debug('required type %s, list: %s' % (type(required), required))` Не надо форматить строчки так, посмотри сигнатуру этих методов: ```Logger.log(lvl, msg, *args, **kwargs)``` Да, вот так просто, так что лучше писать `app_logger.debug('required type %s, list: %s', type(required), required)`. А ещё лучше `app_logger.debug('required type %(req_type)s, list: %(req_list)s', req_type=type(required), req_list=required)`, читаемость больших сообщений улучшается. > `except Exception, exp:` Не используй, этот deprecated синтаксис, третий питон его не поддерживает. Тем более странно, что выше у тебя нормально написано -- `except KeyError as key:`. Выглядит, будто ты надёргал кусков из чужого кода. > `except Exception, exp:` Да, ещё раз эта же строчка. Да-да, "too broad", ЕТПОЧЯ. Ты же там ожидаешь рерайзнутый KeyError, так зачем ловить всё? Так ты можешь напороться на баг в коде, который приведёт к некорректному сообщению об ошибке (эксепшн будет из-за другой причины (бага), не соответствующей сообщению, которое ты будешь видеть). ``` > for product in self.products: > self.args['order'].args['product'] += product.to_xml() + '\n' ``` Конкатенация иммутабельных строк 'slow as hell'. `self.args['order'].args['product'] += '\n'.join(product.to_xml() for product in self.products)` будет гораздо оптимальнее. В общем, заметно, что ты только поделки в отделе *внедрения* пишешь. И тебе может показаться, что это всё бессмысленные микрооптимизации. Но поверь мне, это не так. Когда твой код будет обслуживать чуть более, чем одного человека, и работать с данными чуть более, чем из десяти строк, ты почувствуешь разницу. Ах да, самое главное -- зачем вообще велосипедил это, ведь есть готовые решения. Работать с XML как с строкой-шаблончиком так себе идея.
#U5GE66/EBA / @anonymous --> #U5GE66/HP4 / 1433 дня назад
@anonymous Этот код хуярит в около-хуйлоаде сейчас, ~1000 вызов создания заявок в минуту, жалоб не поступало. Если поступят, я возьму профайлер и посмотрю, как можно сделать лучше, потратив пять минут. Готовые решения имеют место быть, но мне сказали сделать и я сделал, потратив не более трех дней на описание всех шаблонов и создание няшного объектного интерфейса. Ты можешь продолжать оптимизировать, но как ты уже заметил, мне похуй.
#U5GE66/WRK / @je --> #U5GE66/EBA / 1433 дня назад
@je Да, я давно заметил, что ты говнокодер и не планируешь прокачиваться в стороне НЕговнокодерства. Зачем, на лосось-то хватает нищезарплатки в парашном промгородке. Куда-то стремиться, развиваться... не, пустое это.
#U5GE66/C92 / @anonymous --> #U5GE66/WRK / 1433 дня назад
@anonymous \*в сторонУ
#U5GE66/W0G / @anonymous --> #U5GE66/C92 / 1433 дня назад
@anonymous Бля давай потом погорим, у меня пятничный дедлайн и куча задач по sql.
#U5GE66/732 / @je --> #U5GE66/C92 / 1433 дня назад
@je обосрался на весь VPS за $10
#U5GE66/KKY / @komar --> #U5GE66/WRK / 1433 дня назад
@komar Ты о чем вообще.
#U5GE66/D8Q / @je --> #U5GE66/KKY / 1433 дня назад
@je о хуйлоаде на 1000 заявок в минуту и твоих манярационализациях ... лол
#U5GE66/DDW / @anonymous --> #U5GE66/D8Q / 1433 дня назад
@je Ясно, рабу нужно хуячить, солнце ещё высоко. А что там с sql, он же *простой*, за пять минут с ним управишься, хули ты. Ты же манька-хуянька-супергерой!
#U5GE66/AVW / @anonymous --> #U5GE66/732 / 1433 дня назад
@anonymous как будто работать - что-то плохое. вообще рынок держится на наемном труде
#U5GE66/395 / @anarchy --> #U5GE66/AVW / 1433 дня назад
@je Ладно-ладно. Но реализацию BaseComponent обещаешь сделать? Там же реально нехуй делать, мне полчаса понадобилось, а я не такой крутой программист, как ты. Ты вон какую крутую штуку для иксэмеля сделал…
#U5GE66/05Y / @anonymous --> #U5GE66/732 / 1433 дня назад
@anarchy Так у пидорах принято кичиться как раз тем, как они *не работают* (смотри, какой ушлый, наебал дядю, а он мне ещё и деньги платит). Манька из вот этих.
#U5GE66/GFL / @anonymous --> #U5GE66/395 / 1433 дня назад
Блядь, я нихуя не понял. Пиздонщикам шаблонизатор не подвезли, или они в 2017 году решили, что генерить *ML из конструкторов — это охуенная идея?
#U5GE66/7E0 / @komar / 1433 дня назад
@komar Есть такая штука… just for fun. Вот это оно и есть. Неужели ты подумал, что это сделано с расчётом на практическое применение, лол?
#U5GE66/C3C / @anonymous --> #U5GE66/7E0 / 1433 дня назад
@anonymous Никогда бы не подумал, что кому-то нравится ебаться с компьюторами просто так.
#U5GE66/0AN / @komar --> #U5GE66/C3C / 1433 дня назад
@komar Ну, ты чо. А как же хаскелисты?
#U5GE66/KNX / @anonymous --> #U5GE66/0AN / 1433 дня назад
@komar секс с роботами @ неизбежен
#U5GE66/USM / @anonymous --> #U5GE66/0AN / 1433 дня назад
@anonymous ах да, совсем забыл
#U5GE66/S9X / @komar --> #U5GE66/KNX / 1433 дня назад

http://pasterack.org/pastes/83741
```

lang racket

(require scribble/html/html)
(require scribble/html/xml)

(define my-component%
(class object%
(super-new)

(define/public (render)
  (printf
   (xml->string
    (element 'div 'class: "toolbar" 'id: "#123"
             (element 'a 'class: "main-link" 'href: "/nowhere"
                      "Click me"
                      (element 'img 'src: "http://deaddrop.ftp.sh/QvystY0EkXu6.jpg")
                      "Please!")
             (element 'hr)))))))

(send (new my-component%) render)
```

#U5GE66/CHQ / @ninesigns / 1433 дня назад
@ninesigns Прямо каноничный пример «почему нельзя использовать sexp для разметки» из моей статьи пятилетней давности.
#U5GE66/NXM / @komar --> #U5GE66/CHQ / 1433 дня назад
@ninesigns СКУКА, на ЭСЭКСПРЕШОНАХ любой дурак может)))
#U5GE66/L1V / @anonymous --> #U5GE66/CHQ / 1433 дня назад
@komar Почему?
#U5GE66/LTK / @kuzy000 --> #U5GE66/NXM / 1433 дня назад
ipv6 ready BnW для ведрофона BnW на Реформале Викивач Котятки

Цоперайт © 2010-2016 @stiletto.