Как юниксовый пользователь со стажем, мне кажется, что это слабый аргумент.
В Windows тоже можно менять любые параметры и при этом ломать систему, а затем лезть в режим восстановления, чтобы все починить. И также есть командная строка, и даже Power Shell, который является клиентом полноценной среды объектов .NET, откуда юниксы со своими текстовыми фильтрами stdin/out еще уедут не скоро.
И почему-то на хабрахабре я помню больше интересных технических статей о Windows и его интересных хаков, а про линукс лезут в голову только советы по работе с историей в bash.
Я даже держу отдельно одну машину с виндой для того (хоть и захожу на неё в основном через sshd/cygwin), чтобы играться этим всем от того, что это жуть как интересно. Отладчики, трассировщики, шеллы и скриптовые языки тут тоже есть ;)
Ну раз уж совсем питон, то я бы делал (относительно примера): sum(i * p for i,p in Item.objects.all().values_list('item', 'price'))
— и о namedtuples бы даже не подумал :-P
Да. In [26]: o = pa.model.objects.all().only('name')[0]
In [27]: o
Out[27]: <Product_Deferred_list_of_deferred_fields: someproduct>
In [28]: dict(o.__class__.__dict__)
Out[28]:
{...
'ops': <db.models.query_utils.DeferredAttribute object at 0x7eb6150c>,
...}
In [30]: o.ops
Out[30]: u'лалала'
In [31]: connection.queries[-2:]
Out[31]:
[{'sql': u'SELECT "product"."id", "product"."name" FROM "product" LIMIT 1',
'time': '0.000'},
{'sql': u'SELECT "product"."id", "product"."ops" FROM "product" WHERE "ipc_product"."id" = 1 ',
'time': '0.000'}]
DeferredAttribute — обычный дескриптор новосозданного (см db.models.deferred_class_factory) класса внутри QuerySet, который реализует нужное поведение внутри __get__.
Да, это не так быстро, как namedtuples (а изначально было создано для исключения _больших_ полей типа text из выборки, а не включения маленьких по одному) — но в случае особого желания доступа к элементам по именам делая большую выборку из большой базы, имхо, легче будет просто распаковать кортеж из values_list() внутри тела цикла.
Как юниксовый пользователь со стажем, мне кажется, что это слабый аргумент.
В Windows тоже можно менять любые параметры и при этом ломать систему, а затем лезть в режим восстановления, чтобы все починить. И также есть командная строка, и даже Power Shell, который является клиентом полноценной среды объектов .NET, откуда юниксы со своими текстовыми фильтрами stdin/out еще уедут не скоро.
И почему-то на хабрахабре я помню больше интересных технических статей о Windows и его интересных хаков, а про линукс лезут в голову только советы по работе с историей в bash.
Я даже держу отдельно одну машину с виндой для того (хоть и захожу на неё в основном через sshd/cygwin), чтобы играться этим всем от того, что это жуть как интересно. Отладчики, трассировщики, шеллы и скриптовые языки тут тоже есть ;)
sum(i * p for i,p in Item.objects.all().values_list('item', 'price'))
— и о namedtuples бы даже не подумал :-P
In [26]: o = pa.model.objects.all().only('name')[0]
In [27]: o
Out[27]: <Product_Deferred_list_of_deferred_fields: someproduct>
In [28]: dict(o.__class__.__dict__)
Out[28]:
{...
'ops': <db.models.query_utils.DeferredAttribute object at 0x7eb6150c>,
...}
In [30]: o.ops
Out[30]: u'лалала'
In [31]: connection.queries[-2:]
Out[31]:
[{'sql': u'SELECT "product"."id", "product"."name" FROM "product" LIMIT 1',
'time': '0.000'},
{'sql': u'SELECT "product"."id", "product"."ops" FROM "product" WHERE "ipc_product"."id" = 1 ',
'time': '0.000'}]
DeferredAttribute — обычный дескриптор новосозданного (см db.models.deferred_class_factory) класса внутри QuerySet, который реализует нужное поведение внутри __get__.
Да, это не так быстро, как namedtuples (а изначально было создано для исключения _больших_ полей типа text из выборки, а не включения маленьких по одному) — но в случае особого желания доступа к элементам по именам делая большую выборку из большой базы, имхо, легче будет просто распаковать кортеж из values_list() внутри тела цикла.
Item.objects.all().only('name')
возвращает модель с Deferred Attributes. и никаких велосипедов