recursive function: use a global or pass a parameter?
Tim
jtim.arnold at gmail.com
Fri Jan 16 13:48:41 EST 2015
On Friday, January 16, 2015 at 1:34:51 PM UTC-5, Peter Otten wrote:
>> Tim wrote:
>>
> Globals are generally bad as they make code non-reentrant; when two calls of
> the function run simultaneously the data will be messed up.
>
> I recommend that you use a generator:
>
> >>> def walk(obj):
> ... if not hasattr(obj, "keys"):
> ... return
> ... if "things" in obj:
> ... yield obj["things"]
> ... for v in obj.values():
> ... yield from walk(v)
> ...
> >>> d = {'things':1, 'two':{'things':2}}
> >>> set(walk(d))
> {1, 2}
>
> In Python before 3.3 you have to replace
>
> yield from walk(v)
>
> with a loop:
>
> for t in walk(v):
> yield t
Ah, a generator, I wouldn't have seen the problem in this way, but with your example, it looks so natural.
thanks,
--Tim
More information about the Python-list
mailing list