[Aahz] > Speaking as a person who does relatively little C programming, I don't > see much difference between them. The first example is more Pythonic -- > for Python. I agree with Barry that it's not much of a virtue for C > code.
It was a trick question. Everyone is supposed to be attracted to the _next version because it is shorter, faster, and takes less ref counting management. However, the _next version has a hard-to-find bug. The call to PyObject_Hash() can trigger arbitrary Python code and possibly mutate the table, leaving pointers to invalid memory addresses. It would likely take Armin less than five minutes to write a pure Python crasher for the code. And THAT is why PySet_Next() should never come into being. The iterator form is more duck-typable and re-usable than the set specific _next version, but the example was chosen to take that issue off of the table and just focus on mutation issues. > However, I do have one nitpick with both your examples; I don't know > whether this is an artifact of them being examples: > >> hash ^= h * 3644798167; > > Seems to me that magic numbers like this need to be made constants and > explained with a comment FWIW, the actual code does have comments. I stripped them out of the posting because they weren't relevant to the code comparison. Raymond _______________________________________________ Python-Dev mailing list Python-Dev@python.org http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com