[Bf-python] Proposed BPyAPI Additions.

Campbell Barton cbarton at metavr.com
Sat Dec 16 03:29:58 CET 2006



Ken Hughes wrote:
> Campbell Barton wrote:
>> Im not keen on this at the moment,
>> having reset would only help in cases where users had the same PyObject
>>
>> # eternal loops like this would still be possible unless we store 
>> some data in the Blender scene
>> for ob in scn.objects:
>>    scn.objects.new(ob.data)
>>
>> the way the iterator currently works is......
>>
>> iter is a BASE pointer, initialized as  NULL, if your loop on objects 
>> it will to a Base.
>> when your finished iterating its set back to NULL.
>>
>> if your loop over the objects and the PyTypes iter value is not 
>> NULL,  then a copy of the scm.objects is returned with iter set to NULL.
>> Without this... the following would not work.
>>
>> obs = scn.objects
>> for ob1 in obs:
>>  for ob2 in obs:
>>    print ob1, ob2
>
> I guess I see the problem you're talking about: there are two 
> different iterators even though to the user there is only one sequence 
> ("obs"). The internal loop is a different iterator PyObject.
>
> I'd vote for one of these two solutions:
> (1) don't allow add or remove in iterators, period
> (2) allow users to add or remove at their own risk, particularly 
> remove().  Adding can cause and enless loop, removing may mean you 
> crash (if you remove the object the iterator is pointing at).
>
> (1) seems a lot more safer, so if a user wants to add an object to the 
> scene they should add to a list, then add the list later:
>
> obs = scn.objects
> l = []
> for ob1 in obs:
>    ... l.append(ob2)
> for ob1 in l:
>    obs.new(l)
>
>> I think its fair to say-
>> "Dont add objects as you loop over them"
>
> Uh, yeah, that's good too :-)
>
> Ken
> ___________
I wonder if the possibility of getting into an eternal loop is that bad.
if your using loops a bit its bound to happen just from your own script.

Ken, Im not sure how you mean for opt (1) - the objects iterator is a 
thin wrapper to the scenes listbase, so if they add objects with 
Object.New() you end up with the same problem.








More information about the Bf-python mailing list