век живи век учись

Dec 23, 2016 11:21

У меня только что тесты поймали крайне странную багу - переменные из одного теста оказывались внутри класса в другом тесте. В начале теста класс честно инициализировался, никаких моков.

После пристальных раздумий я минимизировал происходящее до следующего:

class C ( Read more... )

python

Leave a comment

Comments 12

ravli December 23 2016, 10:08:10 UTC
Dict надо инстанциировать в конструкторе. Так же, как и в def method(self, parameter={}): parameter[a] = b

Reply


mc6312 December 23 2016, 11:27:36 UTC

class C:
a = {}

И будет это a общим для всех экземпляров класса.

Надо:

class C:
def __init__(self, x):
self.a={}
self.a[x]=x

Соотв. все проперти, что всобачены в описании класса, следует считать константами и не изменять.

Reply

amarao_san December 23 2016, 14:14:05 UTC
Не совсем так, неконтейнерные объекты можно смело менять. Если сделать вместо a = {} a=0, а потом перезаписывать, всё будет хорошо.

Reply

mc6312 December 23 2016, 14:46:50 UTC
Можно, но нужно ли? В качестве констант они удобнее, да и безопаснее.

Reply

mc6312 December 26 2016, 18:01:02 UTC
>неконтейнерные
немутабельные

>Если сделать вместо a = {} a=0, а потом перезаписывать, всё будет хорошо.
потому что при перезаписывании:
instance.attr = 420
attr станет атрибутом объекта (экземпляра), а не класса

Reply


tat_ti December 23 2016, 11:42:05 UTC
Это же разные словари, не?
C.a[x] = x
если хотим к тому же словарю.

Reply

amarao_san December 23 2016, 14:13:22 UTC
Вся драма в том, что выглядит это как разные словари, а на самом деле - один.

Reply


angry_elf December 23 2016, 14:48:04 UTC
Дык переменная уровня класса. Клёвый способ выстрелить себе в ногу, да. Хез, зачем оно нужно кроме синглтонов.

Reply

tat_ti December 23 2016, 20:09:46 UTC
Константы или "почти константы" уровня класса.

Reply

mc6312 December 24 2016, 06:13:49 UTC
Вот были бы в пыхтоне настоящие константы...

Reply


maksim_solvent December 23 2016, 17:29:27 UTC
А вот интересно, кто такой broken ?

... )

Reply

amarao_san December 24 2016, 19:04:23 UTC
ЖЖ. Они одно время не позволяли использовать текст в двойных {{скобках}} из-за бага в экранировании и игнорили багрепорт.

Reply


Leave a comment

Up