Ссылка на `self` в`__old__` в ограничениях PyContract
Я работаю над написанием некоторых ограничений для метода класса, используя PyContract (не PyContracts). В качестве постусловия я хотел бы убедиться, что адрес памяти экземпляра не изменился, т.е. id(self)
должно быть одинаковым до и после вызова функции. Как я могу сделать это с PyContract? У меня есть следующий (минимальный) код:
class Individual:
def append(self, chrom):
"""
post:
__old__.self is self
len(__old__.self.chromosomes)+1 == len(self.chromosomes)
self.chromosomes[-1] == chrom
"""
self.chromosomes.append(chrom)
Проблема с ограничениями здесь в том, что в посте я получаю эту ошибку: _holder instance has no attribute 'self'
Интересно, что class Individual
имеет __init__
чьи ограничения выглядят так:
pre:
isinstance(chromosomes, list)
post[chromosomes]:
__old__.chromosomes is chromosomes
__old__.chromosomes == chromosomes
post:
hasattr(self, 'chromosomes')
self.chromosomes == chromosomes
Насколько я могу сказать, PyContract
не нравится, что я звоню __old__.self
, Как мне обойти это?
1 ответ
Решение
Это, кажется, исправить это:
class Individual:
def append(self, chrom):
"""
post[self]:
__old__.self is self
len(__old__.self.chromosomes)+1 == len(self.chromosomes)
self.chromosomes[-1] == chrom
"""
self.chromosomes.append(chrom)