[Cython] cython tests and py3k hash randomization

Stefan Behnel stefan_ml at behnel.de
Fri Feb 24 09:42:26 CET 2012


Vitja Makarov, 24.02.2012 06:24:
> 2012/2/24 mark florisson <markflorisson88 at gmail.com>:
>> On 23 February 2012 20:52, Vitja Makarov <vitja.makarov at gmail.com> wrote:
>>> Recent py3k version has new feature "hash randomization" it solves
>>> some security issues.
>>> But has some drawbacks, for instance, dict.items() order is now
>>> unknown. So it breaks
>>> randomly some doctests that rely on exact order of dict items.
>>>
>>> vitja at mchome:~/python$ ./py3k/bin/python -c  "print({'a':1, 'b':2})"
>>> {'b': 2, 'a': 1}
>>> vitja at mchome:~/python$ ./py3k/bin/python -c  "print({'a':1, 'b':2})"
>>> {'a': 1, 'b': 2}
>>>
>>> As a workaround we can set PYTHONHASHSEED environment variable to zero
>>> for all cyhon-*-tests targets
>>>
>>> This also affects generated code it internally depends on order of
>>> items returned by dict.items()
>>
>> Any code or test that relies on dictionary order is wrong, really. So
>> I assume any pyregr issues will be fixed by the CPython test suite?

Definitely.


>> If there are any such failing tests in Cython we should simply fix them.
> 
> Yes, you're right but I'm not sure how many tests may be broken. I
> don't think we want to fix them before release. Now I've added
> 
> # Disable python hash randomization
> export PYTHONHASHSEED=0
> 
> to cython-devel-tests and it worked.

That should only be a work-around until all tests are fixed, though.


> It's not that easy to fix, here is simple doctest:
> 
> def test_foo():
>     """
>     >>> test_foo()
>     {'a': 1, 'b': 2}
>     """
>     return {'a': 1, 'b': 2}
> 
> You can't use dicts in doctests anymore there are few options instead:
> 1. Compare sorted items(), e.g. sorted(test_foo().items())
> 2. Inplace compare test_foo() == {...}

I always use 1) because it gives you better test failure output in doctests.

Stefan


More information about the cython-devel mailing list