Ссылка на `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)

источник

Другие вопросы по тегам