Эквивалентно опции -R python, которая влияет на хэш ints

У нас есть большая коллекция кода python, которая принимает некоторый вклад и производит некоторый вывод.

Мы хотели бы гарантировать, что, учитывая идентичный ввод, мы производим идентичный вывод независимо от версии python или локальной среды. (например, работает ли код в Windows, Mac или Linux, в 32-разрядной или 64-разрядной версии)

Мы применяем это в автоматизированном наборе тестов, запустив нашу программу как с опцией -R так и без -R и сравним вывод, предполагая, что вытряхнете любые пятна, где наш выход случайно зависнет от итерации по dict . (Наиболее распространенный источник недетерминизма в нашем коде)

Однако, поскольку мы недавно скорректировали наш код, чтобы также поддерживать python 3, мы обнаружили место, где наш вывод зависел частично от итерации над dict которая использовала int s как ключи. Этот порядок итераций изменился в python3 по сравнению с python2 и делал наш вывод другим. Наши существующие тесты (все на python 2.7) этого не заметили. (Потому что -R не влияет на хэш int s) После того, как его нашли, его было легко исправить, но мы хотели бы его найти раньше.

Есть ли способ дальнейшего стресса – проверить наш код и дать нам уверенность в том, что мы выяснили все места, где мы в конечном итоге неявно, в зависимости от того, что может быть различным в версиях / средах python? Я думаю, что что-то вроде -R или PYTHONHASHSEED которое применяется к числам, а также к объектам str , bytes и datetime может работать, но я открыт для других подходов. Тем не менее, мне хотелось бы, чтобы наш автоматизированный тестовый компьютер нуждался только в одной версии python, если это было возможно.

Другой приемлемой альтернативой был бы какой-то способ запустить наш код с помощью pypy, чтобы использовать другой порядок при итерации элементов из dict ; Я думаю, что наш код работает на pypy, хотя это не то, что мы когда-либо явно поддерживали. Однако, если какой-то эксперт pypy дает нам способ настроить порядок итераций словаря на разных прогонах, мы с этим будем работать.

One Solution collect form web for “Эквивалентно опции -R python, которая влияет на хэш ints”

Использование PyPy не является лучшим выбором здесь, учитывая, что он всегда сохраняет порядок вставки в своих dicts (с помощью метода, который заставляет dicts использовать меньше памяти). Разумеется, мы можем изменить его порядок, но он побеждает.

Вместо этого я предлагаю взломать исходный код CPython, чтобы изменить способ использования хеша внутри dictobject.c. Например, после каждого hash = PyObject_Hash(key); if (hash == -1) { ..error.. }; hash = PyObject_Hash(key); if (hash == -1) { ..error.. }; вы можете добавить hash ^= HASH_TWEAK; и скомпилировать разные версии CPython с разными значениями для HASH_TWEAK . (Я сделал что-то в какой-то момент, но больше не могу этого найти. Вам нужно быть немного осторожным, когда значения хэша являются оригинальными или модифицированными).

  • Несколько строк меток x tick в matplotlib
  • Python: импорт urllib.quote
  • Как конвертировать 'из очереди импорта очереди, пустым' из Python 2 в Python 3?
  • почему b '(а иногда и b' ') появляется, когда я разделяю некоторый исходный HTML-код
  • Ящик запроса API Dropbox не работает с Python 3?
  • Подсчет писем происходит Python
  • Как создать сводную таблицу на чрезвычайно больших фреймах данных в Pandas
  • Поведение округления Python 3.x
  • Python - лучший язык программирования в мире.