@spbpython

Страница 27 из 785
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
__class__ assignment: 'Bar' object layout differs from 'Foo'
хм... layout, это нужно проверить, да. надо чтобы дополнительные свойства могли появляться

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__()

но это чревато возвратом некоторых значений на начальное состояние

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

копировать __dict__, потом __init__, а потом __dict__.update из копии?
это не явно, а вот метод - вполне норм, типа там может быть некое измененное состояние, на самом деле, оно даже не изменное, а еще недостроенное и родной init ничего не делает но это именно в моем случае

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

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

никакого уведомления о том, что данных больше не будет нет. т.е. просто идут вызовы __setitem__, а потом перестают идти

ну метод такой должен быть в классе A, над которым у тебя вроде не всегда есть власть
здесь над всем есть власть. все классы какие я хочу, отнаследованы от чего я хочу

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
Такой же обязательный к ознакомлению ... Raymond Hettinger
Ага он тоже, его же привозят на PyCon Russia

Который в Мск в этом году

Я досмотрел только один доклад бизли - 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

Там и такие вещи :(

Страница 27 из 785