New submission from Peter Ebden <peter.eb...@gmail.com>:
We've found that the following code produces non-deterministic bytecode, even post PEP-552: def test(x): if x in {'ONE', 'TWO', 'THREE'}: pass It's not too hard to test it: $ python3.7 -m compileall --invalidation-mode=unchecked-hash test.py Compiling 'test.py'... $ sha1sum __pycache__/test.cpython-37.pyc 61e5682ca95e8707b4ef2a79f64566664dafd800 __pycache__/test.cpython-37.pyc $ rm __pycache__/test.cpython-37.pyc $ python3.7 -m compileall --invalidation-mode=unchecked-hash test.py Compiling 'test.py'... $ sha1sum __pycache__/test.cpython-37.pyc 222a06621b491879e5317b34e9dd715bacd89b7d __pycache__/test.cpython-37.pyc It looks like the peephole optimiser is converting the LOAD_CONST instructions for the set into a single LOAD_CONST for a frozenset which then serialises in nondeterministic order. One can hence work around it by setting PYTHONHASHSEED to a known value. I'm happy to help out with this if needed, although I don't have a lot of familiarity with the relevant code. ---------- components: Interpreter Core messages: 325644 nosy: Peter Ebden priority: normal severity: normal status: open title: Non-deterministic bytecode generation versions: Python 3.7 _______________________________________ Python tracker <rep...@bugs.python.org> <https://bugs.python.org/issue34722> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com