Comments 28
Я может и не прав, на 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
std::tie(a, b) = std::tie(b, a);
Как по мне, так возможность написать a, b = b, a без загромождения кода и есть плюс. Собственно, автор и пишет, что в Питоне взяли лучшие практики и включили в синтаксис. Также он пишет про обратный перенос лучших практик, что мы и видим в вашем примере — практику из Питона реализовали в Плюсах, насколько это было возможно.
Оператор += на самом деле не эквивалентен сложению и последующему присвоению. На самом деле это __iadd__
и присвоение результата. Для изменяемых типов как правило iadd возвращает тот же объект на котором вызван, для неизменяемых — новый. Из-за этого поведения бывают казусы, как например изменение элемента (изменяемого типа) тупла по индексу.
А доступная с C++14 конструкция типа
Век живи, век учись :) Даже не знал, что так можно и никогда не видел. Хотя откровенно говоря так себе затея так писать, как по мне, но где-то может быть полезно. Хотя уже давно есть structure bindings, так что можно вообще почти как на питоне написать :)
А подход с анонимным типом — заглядывать внутрь реализации функции, чтобы понять что же там возвращается и какие у этого типы) Так себе идея)
Не все IDE хорошо работают с шаблонами и auto. К сожалению, мне тяжело привести пример, т.к. на мелких примерах IDE работают хорошо, но как только кодовая база переваливает за 100 файлов с 150к+ строк кода, начинается веселье :) Хотя конечно принципиально мне пофигу, любой вариант приемлем.
ИМХО: предпочтительней рассчитывать на то, что доки/ide не будет (и вообще, код будет поддерживать маньяк).
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++. Часть 2/2