elglin: (Default)
[personal profile] elglin
В каждом языке, я думаю, есть свой brainfuck на эту тему. В Сях есть классическое a = b++; , которым пугают на первых занятиях, в питоне есть нюансы, что "если у тебя тупл из списков, то элементы списков можно менять".
Вчера напоролись на очередную идиосинкразию поша. Логика системы, не вдаваясь в подробности, требует взять файлик и кинуть его в ручку.
with open('file.txt') as fin:
    send_to_rest_handle(json.dumps({'data': fin.read()})) # The file is at most 20K

Ручка, естественно, валидирует ввод, и при десериализации очень хочет, чтобы data было str и никаких.
И тут казалось бы аналогичный код с винды начинает валить четырехсотки, причем именно валидацией.
Виндовый код был, казалось бы, настолько же прост:
Send-ToRestHandle -Data (@{"data" = (gc -raw 'file.txt')} | ConvertTo-Json)

И вот если вы наивно проверите тип того, что вам даст gc -raw, то это будет String!
> $foo = gc -raw file.txt
> $foo.gettype()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     String                                   System.Object

А потом просто посмотрите, как этот якобы String сериализуется. Ни черта это не String, это пол-таблицы Менделеева. Правильный ответ: (gc -raw 'file.txt').value.

И в чем тут парадокс. Неплохой язык пошик, и я как-то писал, что если бы в линухе запилили python-shell, то он был бы не менее идиосинкразиен. Проблем здесь две:
1. "Интуитивно-неинтуитивное поведение".
2. За счет объектной модели, конвейера объектов и вот этого всего некоторые простые вещи делаются сложно. И вот на фоне баша, питона и даже Сей, где задача почитать-пофильтровать-пописать очень интуитивна, пошик именно в этом компоненте грустен.
Page generated May. 13th, 2026 08:31 am
Powered by Dreamwidth Studios