tcl list to python list?

Paul McGuire ptmcg at austin.rr._bogus_.com
Mon Sep 18 05:00:41 CEST 2006


"Cameron Laird" <claird at lairds.us> wrote in message 
news:gv51u3-4j4.ln1 at lairds.us...
> In article <1158459542.693284.98090 at h48g2000cwc.googlegroups.com>,
> <jerry.levan at gmail.com> wrote:
>>Hi,
>>
>>I have a file that contains a "tcl" list stored as a string.  The list
>>members are
>>sql commands ex:
>> { begin { select * from foo
>>                where baz='whatever'}
>>  {select * from gooble } end
>>  { insert into bar values('Tom', 25) } }
>>
>>I would like to parse the tcl list into a python list...
>>
>>Any suggestions ( I am running Tkinter...)
> .
> .
> .
> No correct solution's going to be as elegant as I suspect you imagine.
> Here's an example of what's required:
>
>  # If you try anything you suspect is simpler, you're going to have to
>  # teach Python about Tcl treatment of whitespace, or teach Tcl how
>  # Python quotes, or ...
>
>  import Tkinter
>  tcl_list = """{ begin { select * from foo
>                  where baz='whatever'}
>    {select * from gooble } end
>    { insert into bar values('Tom', 25) } }"""
>
>      # Collect the Python list here.
>  result = []
>      # Create a single Tcl interpretive context for all the work.
>  tk_instance = Tkinter.Tk().tk.eval
>      # Everything Tcl returns is a string; make this value an integer.
>  tcl_list_length = int(tk_instance(
>             "set tcl_list %s; llength $tcl_list" % tcl_list))
>
>      # With all the set-up done, simply loop over the elements.
>  for counter in range(tcl_list_length):
>          # Ask Tcl for each successive list item.
>      result.append(tk_instance("lindex $tcl_list %d" % counter))
>
>  print result
>
> The output is
>  ['begin', " select * from foo\n                where baz='whatever'", 
> 'select * from gooble ', 'end', " insert into bar values('Tom', 25) "]

Elegant-shmelegant, looks like it gets the job done, and neatly too.  I had 
no idea that you can invoke Tcl so easily from Python.

Why is your indentation so weird though?  The comments actually make your 
solution harder to read.  If I may be so forward as to edit for readability 
(I think a list comprehension to build the actual list is easier to follow 
than the for loop with the strangely-indented comments):

# Create a single Tcl interpretive context for all the work.
tk_instance = Tkinter.Tk().tk.eval

# define list in Tcl context, and extract number of elements
tk_instance("set tcl_list %s" % tcl_list)
numItems = int(tk_instance("llength $tcl_list"))

# build Python list indexing by each item
result = [ tk_instance("lindex $tcl_list %d" % i)
            for i in range(numItems)]


-- Paul





More information about the Python-list mailing list