From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Eric Schulte" Subject: Re: Org-babel `:hlines yes` no longer working for python Date: Sun, 27 Jun 2010 16:43:42 -0700 Message-ID: <87wrtk6nyp.fsf@gmail.com> References: <87k4pl27vv.fsf@dustycloud.org> <87bpaxbu2w.fsf@gmail.com> <87d3vd1rkc.fsf@dustycloud.org> <87k4pla5g0.fsf@gmail.com> <878w611bi4.fsf@dustycloud.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Return-path: Received: from [140.186.70.92] (port=37727 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1OT1Vs-00015t-TR for emacs-orgmode@gnu.org; Sun, 27 Jun 2010 19:43:50 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1OT1Vr-0006gR-6V for emacs-orgmode@gnu.org; Sun, 27 Jun 2010 19:43:48 -0400 Received: from mail-pv0-f169.google.com ([74.125.83.169]:51549) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1OT1Vq-0006gE-Qa for emacs-orgmode@gnu.org; Sun, 27 Jun 2010 19:43:47 -0400 Received: by pvg11 with SMTP id 11so2807483pvg.0 for ; Sun, 27 Jun 2010 16:43:45 -0700 (PDT) In-Reply-To: <878w611bi4.fsf@dustycloud.org> (Christopher Allan Webber's message of "Sat, 26 Jun 2010 20:59:31 -0500") 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: Christopher Allan Webber Cc: emacs-orgmode@gnu.org Hi, OK, I've applied this patch. Christopher Allan Webber writes: > 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 :)) > Yea, this semantic mismatch bothered me, however it looks like Python doesn't have anything like symbols that could be used here, and I guess there isn't an issue of wanting to preserve "None" for "nil" mapping because "nil" can be represented with an empty list "[]". Thanks for bringing this up! -- Eric > > - 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))