tcl list to python list?

Paddy paddy3118 at netscape.net
Mon Sep 18 07:43:08 CEST 2006


Paul McGuire wrote:
> "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

Thanks, Cameron, Paul;
I'm still in the Electronics business, where TCL is everywhere. I too
did not know how easy it is to invoke TCL from inside Python. Yet more
ammunition in my quest to be allowed to write more Python at work.

- Cheers, Paddy.




More information about the Python-list mailing list