Pull to refresh

Comments 28

UFO just landed and posted this here
Ждем статью «Кухонный нож как предельный случай скальпеля».
UFO just landed and posted this here

Я может и не прав, на Python не пишу, но насколько я помню, в Python все int-константы — это реально существующие объекты в единичном экземпляре, и когда вы пишите


a = 1

вы присваиваете a ссылку на ту самую (одну единственную на весь код) единицу.
Следуя этой логике, b = a, b += 1 эквивалентно b = a, b = b + 1, где b + 1 возвращает ссылку уже на новую константу. Все сошлось.
Вот эксперимент:


>>> x = 4
>>> y = 4
>>> hex(id(x))
'0x7fffe73693a0'
>>> hex(id(y))
'0x7fffe73693a0'
>>> y += 1
>>> hex(id(5))
'0x7fffe73693c0'
Ага.

>>> a = 1
>>> hex(id(a))
'0x10100ff30'
>>> hex(id(1))
'0x10100ff30'

Не все.


>>> x=-1
>>> id(x) == id(-1)
True
>>> x=123456
>>> id(x) == id(123456)
False

Хмм… Не знаю как у вас, но у меня Python 3 выдаёт исключительно True


Вы какой интерпретатор используете?

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

std::tie(a, b) = std::tie(b, a);

Как по мне, так возможность написать a, b = b, a без загромождения кода и есть плюс. Собственно, автор и пишет, что в Питоне взяли лучшие практики и включили в синтаксис. Также он пишет про обратный перенос лучших практик, что мы и видим в вашем примере — практику из Питона реализовали в Плюсах, насколько это было возможно.

UFO just landed and posted this here
UFO just landed and posted this here
UFO just landed and posted this here
UFO just landed and posted this here
UFO just landed and posted this here
UFO just landed and posted this here

Оператор += на самом деле не эквивалентен сложению и последующему присвоению. На самом деле это __iadd__ и присвоение результата. Для изменяемых типов как правило iadd возвращает тот же объект на котором вызван, для неизменяемых — новый. Из-за этого поведения бывают казусы, как например изменение элемента (изменяемого типа) тупла по индексу.

А доступная с C++14 конструкция типа

Век живи, век учись :) Даже не знал, что так можно и никогда не видел. Хотя откровенно говоря так себе затея так писать, как по мне, но где-то может быть полезно. Хотя уже давно есть structure bindings, так что можно вообще почти как на питоне написать :)

UFO just landed and posted this here

А подход с анонимным типом — заглядывать внутрь реализации функции, чтобы понять что же там возвращается и какие у этого типы) Так себе идея)

UFO just landed and posted this here
Ну если типы одинаковые, то… кортеж из двух строк — все же потенциальный источник ошибок, которые компилятор не словит.
UFO just landed and posted this here
Сорри, я тогда просто не уловил из переписки, о чем речь шла.

Не все IDE хорошо работают с шаблонами и auto. К сожалению, мне тяжело привести пример, т.к. на мелких примерах IDE работают хорошо, но как только кодовая база переваливает за 100 файлов с 150к+ строк кода, начинается веселье :) Хотя конечно принципиально мне пофигу, любой вариант приемлем.

Смелое утверждение.

ИМХО: предпочтительней рассчитывать на то, что доки/ide не будет (и вообще, код будет поддерживать маньяк).
UFO just landed and posted this here
В C# анонимные типы всё-таки поудобнее — не надо описывать тип каждого поля, просто new и всё.
var sheet = SomeDatabase.Employees
    .Where(employee => employee.Fired == false)
    .SelectMany(employee => employee.Payments.Where(payment => payment.Date == curMonth),
        (employee, payment) => new { Name = employee.Name, Sum = payment.Sum });
Изобразить такое на плюсовых лямдах, наверное, будет вырвиглазно.

Кстати, не хотят ли в плюсы завести Expression Trees из c#?
Всё это, конечное, хорошо, но python намного медленнее C++, а значит не может претендовать на нишу C++, а значит и предельным случаем быть не может. Сейчас, вроде, один более или менее популярный язык, который пытается и исправить недочёты c/c++, и работать не медленнее: Rust.
Sign up to leave a comment.

Articles