WENDUM Denis 47.76.11 (agent) wrote:
>...  From the answers I've got it seems I'll have to check if I'm
> iterating on a string or on another kind of "list"....
>>>> import sys
>>>> sys.setrecursionlimit(10)
>>>> def f(List):
> ...       try: # assuming List supports iteration
> ...           new=[f(item) for item in List]
> ...       except:# if no iteration is possible
> ...           new=1
> ...       return new
>>>> f([1, [2,3]]) # f substitutes each non iterable item by 1 (silly 
>>>> butshows the problem)
> [1, [1, 1]]
>>>> f([1, [2.3, (5,6,7)]])
> [1, [1, [1, 1, 1]]]
>>>> f('bac')
> [[[[[[[[1]]]]]]], [[[[[[[1]]]]]]], [[[[[[[1]]]]]]]]
>>>> sys.setrecursionlimit(5)
>>>> f('bac')
> [[[1]], [[1]], [[1]]]
>>>> # each item in 'bac' is a character, 
> ie. a string of length one on wich one can iterate
> and so triggers an infinite descent of recursion.

I'd rewrite your 'f' as follows:
     def copier(List):
         try: # assuming List supports iteration
            new = [f(item) for item in List]
         except TypeError: # Non-iterables get replaced
             return '?'
         except RuntimeError: # Recursion failures get shown
             return 'Recursion'
         return new

Note, even if you got your wish and somehow you couldn't have an issue
with characters in strings, you would have to deal with this:

    simple_list = [3.1415]
    container = [simple_list]
    simple_list.append(container)

Your function (and mine) assumes the argument is a DAG (Directed Acyclic
Graph), but there is no such guarantee about data structures in python.

--Scott David Daniels
[EMAIL PROTECTED]
-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to