From mboxrd@z Thu Jan 1 00:00:00 1970 From: Christopher Allan Webber Subject: Re: Org-babel `:hlines yes` no longer working for python Date: Sat, 26 Jun 2010 20:59:31 -0500 Message-ID: <878w611bi4.fsf@dustycloud.org> References: <87k4pl27vv.fsf@dustycloud.org> <87bpaxbu2w.fsf@gmail.com> <87d3vd1rkc.fsf@dustycloud.org> <87k4pla5g0.fsf@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Return-path: Received: from [140.186.70.92] (port=44856 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1OSh9W-0002Hq-VC for emacs-orgmode@gnu.org; Sat, 26 Jun 2010 21:59:24 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1OSh9V-0007fp-EB for emacs-orgmode@gnu.org; Sat, 26 Jun 2010 21:59:22 -0400 Received: from li28-75.members.linode.com ([75.127.72.75]:42196) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1OSh9V-0007fc-B7 for emacs-orgmode@gnu.org; Sat, 26 Jun 2010 21:59:21 -0400 In-Reply-To: <87k4pla5g0.fsf@gmail.com> (Eric Schulte's message of "Sat, 26 Jun 2010 13:45:35 -0700") List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org To: Eric Schulte Cc: emacs-orgmode@gnu.org Eric, Looks good to me! It's abusing the None type's meaning a little, but I think it's acceptable enough. (If you think of hlines as rows that are not rows, you can trick yourself into thinking it is perfectly pythonic :)) - cwebb "Eric Schulte" writes: > Hi Christopher, > > I'm certainly no Python expert, but I implemented your idea of > converting "hlines" to and from "None"'s (patch below [1]), and it seems > to work (under some definition of work). See the following example with > the new behavior. > > > --8<---------------cut here---------------start------------->8--- > #+tblname: many-cols > | a | b | c | > |---+---+---| > | d | e | f | > |---+---+---| > | g | h | i | > > #+source: echo-table > #+begin_src python :var tab=many-cols :hlines yes > return tab > #+end_src > > #+results: echo-table > | a | b | c | > |---+---+---| > | d | e | f | > |---+---+---| > | g | h | i | > --8<---------------cut here---------------end--------------->8--- > > Please, Python people, try this out and if you like the behavior then > I'll happily apply the patch. > > Best -- Eric > > Christopher Allan Webber writes: > >> Hey Eric, >> >> Thanks for the super helpful reply! >> >> Out of curiosity, is it likely that we will ever get hline support in >> Python and etc? I've been pondering how it might be done, and maybe it >> could be like this, using a '|-' string instead of a list for the row: >> >> [['a', 'b', 'c'], '|-', ['d', 'e', 'f'], ['g', 'h', 'i']] >> >> Which would produce: >> >> | a | b | c | >> |---+---+---| >> | d | e | f | >> | g | h | i | >> >> Alternately maybe the same thing could be done by abusing None: >> >> [['a', 'b', 'c'], None, ['d', 'e', 'f'], ['g', 'h', 'i']] >> >> Thoughts? >> - cwebb >> >> "Eric Schulte" writes: >> >>> Hi Christopher, >>> >>> Thanks for pointing this out, this is an error in the documentation, >>> which I will update. The code you posted should generate the error you >>> have received. >>> >>> Currently the only language which can handle hlines is emacs-lisp, all >>> other languages will result in errors like the one you pasted below. >>> That's not to say that it wouldn't be possible to add hline handling to >>> other languages, or to maybe do something tricky like session-based >>> evaluation in which an `hlines' variable was pre-initialized to some >>> value, but I digress. >>> >>> Note that it *is* possible to have hlines in the output, using colnames, >>> e.g. >>> >>> >>> --8<---------------cut here---------------start------------->8--- >>> #+tblname: A >>> | a | b | c | >>> |---+---+---| >>> | d | e | f | >>> | g | h | i | >>> >>> #+begin_src python :var tab=A :colnames yes >>> return [[val + '*' for val in row] for row in tab] >>> #+end_src >>> >>> #+results: >>> | a | b | c | >>> |----+----+----| >>> | d* | e* | f* | >>> | g* | h* | i* | >>> --8<---------------cut here---------------end--------------->8--- >>> >>> which works because the hline, and the column names, are never made >>> available to python, rather Babel holds onto them and then re-applies >>> them to the source block's output. >>> >>> or even to have an elisp block add hlines to your results >>> >>> >>> --8<---------------cut here---------------start------------->8--- >>> #+tblname: many-cols >>> | a | b | c | >>> |---+---+---| >>> | d | e | f | >>> |---+---+---| >>> | g | h | i | >>> >>> #+source: echo-table >>> #+begin_src python :var tab=many-cols >>> return tab >>> #+end_src >>> >>> #+begin_src emacs-lisp :var table=echo-table >>> (butlast (apply #'append (mapcar (lambda (el) (list el 'hline)) table))) >>> #+end_src >>> >>> #+results: >>> | a | b | c | >>> |---+---+---| >>> | d | e | f | >>> |---+---+---| >>> | g | h | i | >>> --8<---------------cut here---------------end--------------->8--- >>> >>> Thanks for pointing this out! >>> >>> Best -- Eric >>> >>> Christopher Allan Webber writes: >>> >>>> Hello all, >>>> >>>> I was going through the tutorial and testing the :hlines yes feature as >>>> described in the info manual. Unfortunately, the example given no >>>> longer seems to work for python: >>>> >>>> #+tblname: many-cols >>>> | a | b | c | >>>> |---+---+---| >>>> | d | e | f | >>>> |---+---+---| >>>> | g | h | i | >>>> >>>> #+source: echo-table >>>> #+begin_src python :var tab=many-cols :hlines yes >>>> return tab >>>> #+end_src >>>> >>>> #+results: echo-table >>>> | a | b | c | >>>> | d | e | f | >>>> | g | h | i | >>>> >>>> In the buffer *Org-Babel Error Output* I see: >>>> >>>> Traceback (most recent call last): >>>> File "", line 6, in >>>> File "", line 3, in main >>>> NameError: global name 'hline' is not defined >>>> >>>> In emacs-lisp this still seems to work though. But I also see that in >>>> emacs lisp hlines are represented by the hline symbol. I'm guessing >>>> that the python equivalent was trying to do the same thing, but no hline >>>> variable exists in python? >>>> >>>> Thanks! >>>> - cwebb >>>> >>>> _______________________________________________ >>>> Emacs-orgmode mailing list >>>> Please use `Reply All' to send replies to the list. >>>> Emacs-orgmode@gnu.org >>>> http://lists.gnu.org/mailman/listinfo/emacs-orgmode > > Footnotes: > [1] > > diff --git a/lisp/babel/langs/ob-python.el b/lisp/babel/langs/ob-python.el > index 2ce9e1d..29bb166 100644 > --- a/lisp/babel/langs/ob-python.el > +++ b/lisp/babel/langs/ob-python.el > @@ -96,7 +96,7 @@ called by `org-babel-execute-src-block'." > specifying a var of the same value." > (if (listp var) > (concat "[" (mapconcat #'org-babel-python-var-to-python var ", ") "]") > - (format "%S" var))) > + (if (equal var 'hline) "None" (format "%S" var)))) > > (defun org-babel-python-table-or-string (results) > "If the results look like a list or tuple, then convert them into an > @@ -110,7 +110,9 @@ Emacs-lisp table, otherwise return the results as a string." > "\\[" "(" (replace-regexp-in-string > "\\]" ")" (replace-regexp-in-string > ", " " " (replace-regexp-in-string > - "'" "\"" results)))))) > + "'" "\"" > + (replace-regexp-in-string > + "None" "hline" results t))))))) > results))) > > (defvar org-babel-python-buffers '(:default . nil))