On 6/1/2012 7:40 PM, Temia Eszteri wrote:

Given that len(weakset) is defined (sensibly) as the number of currently
active members, it must count. weakset should really have .__bool__
method that uses any() instead of sum(). That might reduce, but not
necessarily eliminate your problem.

Think it might be worth looking into submitting a patch for the next
minor releases for Python if it turns out to solve the problem?

I think a patch would be worthwhile even if this is not the source of your problem. If bool is defined as 'if any ...', that should be the code.

I can think of two reasons:

1. You are using multiple threads and another thread does something to
change the size of the set during the iteration. Solution? put a lock
around the if-statement so no other thread can change self.data during
the iteration.

2. Weakset members remove themselves from the set before returning None.
(Just a thought, in case you are not using threads).

In other words, it is possible that weakset.__len__ is buggy. Since you are sure that 1) is not your problem, that seems more likely now.

If the weak references removing themselves is the case, it seems like
a kind of silly problem - one would imagine they'd wrap the data check
in _IterationGuard in the _weakrefset.py file like they do for calls
to __iter__(). Very strange.

While looking into the weakset code, you might check the tracker for weakset issues. And also check the test code. I have *no* idea how well that class has been exercised and tested. Please do submit a patch if you can if one is needed.

--
Terry Jan Reedy

--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to