
Serge
04.04.2016
11:47:03
важно чтобы классовый приехал

Andrey
04.04.2016
11:47:19
так оно же по иерархии ходит всегда

Serge
04.04.2016
11:47:25
и! и вот тут будут проблемы;) метакласс не вызовится, видимо

Aleksandr
04.04.2016
11:47:53
судя по описанию похоже на state , не ?

Google

Andrey
04.04.2016
11:48:14
почему? ты готовый класс присвоил, он уже создался
значит и метакласс был вызван

Serge
04.04.2016
11:48:39
In [19]: %paste
class A():
klass_var = 111
def __init__(self):
self.obj_var = 333
def foo(self):
print('foo')
class B():
klass_var = 222
def __init__(self):
self.obj_var = 444
def foo(self):
print('bar')
def to_A(self):
self.__class__ = A
## -- End pasted text --
In [20]: b = B()
In [21]: b.klass_var
Out[21]: 222
In [22]: b.obj_var
Out[22]: 444
In [23]: b.foo()
bar
In [24]: b.to_A()
In [25]: b.klass_var
Out[25]: 111
In [26]: b.obj_var
Out[26]: 444
In [27]: b.foo()
foo
красота!
что второй, что третий питон - одинаково
а почему мне казалось, что оно так не работает? хм...
ну, т.е. всё круто:)

Andrey
04.04.2016
11:52:51
слишком хорошо, чтобы быть правдой?

Serge
04.04.2016
11:53:12
у меня было ощущение, что я так пробовал когда-то давно и оно так не делало

Andrey
04.04.2016
11:53:34
может это с классами старого вида на втором питоне?

Serge
04.04.2016
11:53:55
может, да, скорее всего
скорее всего я делал это с наследником какого-то встроенного типа в двойке, а там всё не совсем так

Google

Andrey
04.04.2016
11:55:35
не, со старыми классами тоже работает

Serge
04.04.2016
11:56:06
попробуй от dict или int в двойке наследоваться сначала

Aleksandr
04.04.2016
11:57:41
выстрели мне в ногу, зачем такое городить?
class A(object):
def __init__(self):
self.arg = 'A'
def foo(self):
return self.arg
class B(object):
def __init__(self):
self.arg = 'B'
def foo(self):
return self.arg
class Context():
def __init__(self, state=A):
self.state = state()
def goNext(self):
self.state = B()
def foo(self):
return self.state.foo()
c = Context()
print(c.foo()) # A
c.goNext()
print(c.foo()) # B
или я не так понял? :с

Andrey
04.04.2016
11:58:29
не работает, если классы отнаследованы от разных встроенных типов. если от одинаковых, то все норм
__class__ assignment: 'Bar' object layout differs from 'Foo'
надо __slots__ проверить
да, если __slots__ разные, то тоже не дает сменить класс

Serge
04.04.2016
12:07:21

Andrey
04.04.2016
12:10:34
ну если без __slots__, то все нормально можно добавлять, там размещение в памяти не регламентировано тогда

Serge
04.04.2016
12:11:04
__class__ assignment: 'Bar' object layout differs from 'Foo'
In [5]: %paste
class A():
klass_var = 111
another_var = 'aaa'
def __init__(self):
self.obj_var = 333
self.other_obj_var = 'a'
def foo(self):
print('foo')
class B():
klass_var = 222
def __init__(self):
self.obj_var = 444
def foo(self):
print('bar')
def to_A(self):
self.__class__ = A
## -- End pasted text --
In [6]: b = B()
In [7]: b.to_A()
In [8]: b.another_var
Out[8]: 'aaa'
In [9]: b.other_obj_var
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-9-7a859440411d> in <module>()
----> 1 b.other_obj_var
AttributeError: 'A' object has no attribute 'other_obj_var'
__init__ не вызывается и вот это killer case

Andrey
04.04.2016
12:12:03
ну логично, кто же его вызывать будет?

Serge
04.04.2016
12:12:22

Andrey
04.04.2016
12:13:01
придется. потому что в первый раз его вызвал метакласс B при создании объекта, а потом все

Serge
04.04.2016
12:13:22
def to_A(self):
self.__class__ = A
self.__init__()
но это чревато возвратом некоторых значений на начальное состояние

Aleksandr
04.04.2016
12:13:50

Serge
04.04.2016
12:13:51
значит нужен какой-то свой метод

Andrey
04.04.2016
12:13:57
только так можно и состояние объекта случайно перетереть, если там что-то не то в __init__ делается

Google

Serge
04.04.2016
12:14:37
ну т.е. можно сделать свой какой-нибудь _init()

Andrey
04.04.2016
12:14:56
копировать __dict__, потом __init__, а потом __dict__.update из копии?

Serge
04.04.2016
12:14:58
и его вызывать в __init__ и потом в to_A

Andrey
04.04.2016
12:17:08
ну метод такой должен быть в классе A, над которым у тебя вроде не всегда есть власть

Serge
04.04.2016
12:17:56
т.е. кейс в Mnj такой:
1. вызвался пустой __init__
2. получаем данные через __setitem__
3. внезапно получили маркер класса
4. продолжаем получать данные
никакого уведомления о том, что данных больше не будет нет. т.е. просто идут вызовы __setitem__, а потом перестают идти

Dmitry
04.04.2016
12:58:46
наткнулся тут http://dabeaz.com/talks.html
проглядите, мало ли )
в частности, например http://dabeaz.com/coroutines/
а, вижу, сергей его фолловит уже. ок )

Serge
04.04.2016
13:03:10
наткнулся? ;) это ж Бизли!!!
:)
с ним есть одна сложность: доклады по 4-6 часов несколько утомляют;)

Dmitry
04.04.2016
13:11:57
да, я раньше про него не знал )
а есть ещё кто такой же обязательный к ознакомлению?

Vitali K.
04.04.2016
13:38:41
+1

Serge
04.04.2016
13:39:50
ну, настолько даже не знаю
вообще, pycon us, pycon eu

Google

Serge
04.04.2016
13:40:34
ну, как минимум;)

Dmitry
04.04.2016
13:59:58
да, пожалуй. надо последние года пролистать
там вроде ещё какой-то python videos канал на ютьюбе был или вроде того?

Aleksandr
04.04.2016
14:41:51
Не знать бизли, как же так. Я кидал его доклад сюда ) И вообще он монстр.
Такой же обязательный к ознакомлению ... Raymond Hettinger
Например доклад про super()

Dmitry
04.04.2016
14:45:37
>>кидал его доклад сюда
дак чятик блин разворачивается порой быстрее чем падающий рулон туабу. и таких чятиков много о_0

Aleksandr
04.04.2016
14:50:36
Я к тому что ты вроде тогда сказал свое "мяу" )
Но не суть. Тот мужик что выше тоже клвые
Ian Cordasco еще неприкольный

Dmitry
04.04.2016
15:12:41
Который в Мск в этом году
Я досмотрел только один доклад бизли - 3 дня смотрел :)

Sergey
04.04.2016
21:45:49
@lig11 или кто-нибудь
вопрос по монге
использую findAndModify с upsert
нужно получить в ответ старую версию документа И _id
всё хорошо, если документ уже был, но если не было, то получаю null
как решить вопрос?

Pavel
04.04.2016
22:20:06
А что ожидается при отсутствии старой версии?

Sergey
04.04.2016
22:23:59
Что имеешь в виду? Null - нормальный ответ, но я дополнительно хочу получать и _id документа (нового в случае null). Можно свести к одновременному получению и старой, и новой версий.

Pavel
04.04.2016
22:28:39
Ага, понятно.
Не уверен, что в один запрос это решится.
Но предполагается, что по полям в запросе построен уникальный индекс. Тогда _id можно быстро дернуть вторым запросом.
Костыль, да.
@skovorodkin Смотри: https://docs.mongodb.org/manual/reference/command/findAndModify/
Обрати внимание на lastErrorObject.upserted.
> Contains the ObjectId of the inserted document if an update operation with upsert: true resulted in a new document.

Google

Sergey
04.04.2016
22:35:35
Вроде то что нужно! Спасибо, утром попробую

Serge
05.04.2016
05:42:11
И опять вопрос решился чтением документации...

Sergey
05.04.2016
07:32:13

Serge
05.04.2016
14:49:11
length = (length, 200)[length>200]
что-то в этом есть...
http://govnokod.ru/19650

Aleksandr
05.04.2016
14:52:40
ого

Aleksandr
05.04.2016
15:05:15
Крутой подход )
min это конечно слишком сложно.

Aleksandr
05.04.2016
15:08:09
мин не сработает

Aleksandr
05.04.2016
15:08:33
Не сработает почему?
Не вижу подвоха
Или max. Не суть.

Serge
05.04.2016
15:10:08
ну, вообще, там min

Aleksandr
05.04.2016
15:10:10
не, мин, всё верно. Сработает.

Serge
05.04.2016
15:10:14
:)

Aleksandr
05.04.2016
15:11:02
Ну хотя oneliner с if-ом уж лучше чем так (

Aleksandr
05.04.2016
15:11:25
вот я о нём и подумал = \

Serge
05.04.2016
15:11:31
лучше min

Aleksandr
05.04.2016
15:11:38
Это если ты шаришь.

Serge
05.04.2016
15:11:42
ну или and..or

Aleksandr
05.04.2016
15:12:10
страшно

Aleksandr
05.04.2016
15:12:19
offset+=3
Там и такие вещи :(