И еще об идиосинкразиях
May. 28th, 2020 11:58 amВ каждом языке, я думаю, есть свой brainfuck на эту тему. В Сях есть классическое a = b++; , которым пугают на первых занятиях, в питоне есть нюансы, что "если у тебя тупл из списков, то элементы списков можно менять".
Вчера напоролись на очередную идиосинкразию поша. Логика системы, не вдаваясь в подробности, требует взять файлик и кинуть его в ручку.
Ручка, естественно, валидирует ввод, и при десериализации очень хочет, чтобы data было str и никаких.
И тут казалось бы аналогичный код с винды начинает валить четырехсотки, причем именно валидацией.
Виндовый код был, казалось бы, настолько же прост:
И вот если вы наивно проверите тип того, что вам даст gc -raw, то это будет String!
А потом просто посмотрите, как этот якобы String сериализуется. Ни черта это не String, это пол-таблицы Менделеева. Правильный ответ: (gc -raw 'file.txt').value.
И в чем тут парадокс. Неплохой язык пошик, и я как-то писал, что если бы в линухе запилили python-shell, то он был бы не менее идиосинкразиен. Проблем здесь две:
1. "Интуитивно-неинтуитивное поведение".
2. За счет объектной модели, конвейера объектов и вот этого всего некоторые простые вещи делаются сложно. И вот на фоне баша, питона и даже Сей, где задача почитать-пофильтровать-пописать очень интуитивна, пошик именно в этом компоненте грустен.
Вчера напоролись на очередную идиосинкразию поша. Логика системы, не вдаваясь в подробности, требует взять файлик и кинуть его в ручку.
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. За счет объектной модели, конвейера объектов и вот этого всего некоторые простые вещи делаются сложно. И вот на фоне баша, питона и даже Сей, где задача почитать-пофильтровать-пописать очень интуитивна, пошик именно в этом компоненте грустен.