Убедитесь, что в памяти переменная не изменилась

Это продолжение моего предыдущего вопроса

Я работаю над написанием некоторых ограничений для метода класса, используя PyContract (не PyContracts). В качестве постусловия я хотел бы убедиться, что адрес памяти некоторого объекта не изменился, т.е. id(myObj) должно быть одинаковым до и после вызова функции. Как я могу сделать это с PyContract?

Вот что я сейчас делаю:

def foo(param1, param2)
    """
        # some other constraints
        post[param1, param2]:
            __old__.param1 is param1
            __old__.param2 is param2
    """

Однако это постусловие не выполняется. Я могу только представить, что это потому, что __old__.param1 не хранится в той же ячейке памяти, что и param1, Это имеет смысл, так как PyContract должен сделать копию param1 до foo выполняется для проверки его значения по сравнению со значением param1 после foo выполнено

Предполагая, что приведенный выше анализ верен, он служит только для объяснения того, почему id(__old__.param1) отличается от id(param1), Однако, это все еще не отвечает, как я могу гарантировать, что id(param1) не меняется как побочный эффект foo, Как я могу проверить это в PyContract?

1 ответ

Решение

Я не знаком с библиотекой PyContract, которую вы используете, но фактический контракт, для которого вы тестируете, не имеет большого смысла в Python, так как аргументы функции передаются по ссылке. Если у вас есть код, подобный следующему:

x = a
y = b
foo(x, y)

Тогда функция будет получать ссылки на объекты, названные x а также y в области вызова. Внутри вызова функции у вас есть две отдельные переменные, инициализированные ссылками на эти аргументы.

Таким образом, изменения этих переменных внутри функции не могут повлиять на привязку x а также y в области вызова.

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