Re: [O] org-sbe: error when passing strings as parameters to/from Python blocks
* Karl Voit wrote: > > * Daniel Herzig wrote: >> Karl Voit writes: >> >> After some trying I found that the variables as set in the source-code >> header need standard values set: >> >> #+NAME: classificationfm >> #+BEGIN_SRC python :var prob="high" :var impact="high" >> if prob == "high" and impact == "high": >> return "A" >> if prob == "low" and impact == "high": >> return "B" >> if prob == "high" and impact == "low": >> return "C" >> if prob == "low" and impact == "low": >> return "D" >> #+END_SRC >> >> If I don't set them I get exactly the same errors as you. Like this I >> get the following: >> >>| prob | impact | class | >>|--++---| >>| high | high | A | >>| low | high | B | >>| high | low| C | >>| low | low| D | >> #+TBLFM: @2$3..@>$3='(org-sbe classificationfm (prob $$1) (impact $$2)) >> >> Evaluation is being asked for each line then. > > Thanks for the workaround to circumvent the bug. Now, it's working > with my older Org as well. > > Is somebody fixing the bug in Org as well? (Or adding a statement to > the manual?) On reddit[1] loskutak-the-ptak pointed out that the manual states that the default value is not optional: [2] So it is not a bug and it was my own fault from the start. Default values might be omitted for non-string parameters but it is not backed by the documentation. [1] https://www.reddit.com/r/orgmode/comments/b0ll1v/embedding_python_code_in_table_formula/ [2] https://orgmode.org/manual/var.html -- get mail|git|SVN|photos|postings|SMS|phonecalls|RSS|CSV|XML into Org-mode: > get Memacs from https://github.com/novoid/Memacs < Personal Information Management > http://Karl-Voit.at/tags/pim/ Emacs-related > http://Karl-Voit.at/tags/emacs/
Re: [O] org-sbe: error when passing strings as parameters to/from Python blocks
Karl Voit writes: > Hi! Hi! > > I want to test/use Python with org-sbe: > > #+NAME: classificationfm > #+BEGIN_SRC python :exports none :var prob :var impact > > result = "" > if prob == 'high' and impact == 'high': > return 'A' > if prob == 'low' and impact == 'high': > return 'B' > if prob == 'high' and impact == 'low': > return 'C' > if prob == 'low' and impact == 'low': > return 'D' > return 'undefined' > #+END_SRC > After some trying I found that the variables as set in the source-code header need standard values set: #+NAME: classificationfm #+BEGIN_SRC python :var prob="high" :var impact="high" if prob == "high" and impact == "high": return "A" if prob == "low" and impact == "high": return "B" if prob == "high" and impact == "low": return "C" if prob == "low" and impact == "low": return "D" #+END_SRC If I don't set them I get exactly the same errors as you. Like this I get the following: | prob | impact | class | |--++---| | high | high | A | | low | high | B | | high | low| C | | low | low| D | #+TBLFM: @2$3..@>$3='(org-sbe classificationfm (prob $$1) (impact $$2)) Evaluation is being asked for each line then. > (Yes, I should move to elif and the Python code might be coded with > less characters in general: this should not be the point here ;-) ) > > | prob | impact | class | > |--++| > | high | high | #ERROR | > | low | high | #ERROR | > | high | low| #ERROR | > | low | low| #ERROR | > > #+TBLFM: @2$3..@>$3='(org-sbe "classificationfm" (prob $1) (impact $2)) > > I'd expect to get the values of the "class" table column: A, B, C, D > instead of #ERROR. > > > Reading the manual, I found: > | NOTE: By default, string variable names are interpreted as > | references to source-code blocks, to force interpretation of a > | cell’s value as a string, prefix the identifier a "$" (e.g.,"$$2" > | instead of "$2" or "$@2$2" instead of "@2$2"). > > Therefore, I tried the following lines ... > > #+TBLFM: @2$3..@>$3='(org-sbe "classificationfm" (prob "$1") (impact "$2")) > #+TBLFM: @2$3..@>$3='(org-sbe "classificationfm" (prob $$1) (impact $$2)) > > #+TBLFM: @2$3..@>$3='(org-sbe "classificationfm" (prob "$$1") (impact "$$2")) > ... all with same error in the result. > > > My setup: Org mode version 9.1.6 on GNU Emacs 26.0.90 and GNU Emacs 25.1.1 > > > I started a reddit thread[1]. In this thread, somebody was posting > this table showing the error: > > #+NAME: myfunc > #+BEGIN_SRC python :var n="1" > > return "ok" > #+END_SRC > > | 10.3 | 9 | -18 | a | 14 | 11 | 1 | > | ok | ok | ok | #ERROR | ok | ok | ok | > > #+TBLFM: @2='(org-sbe myfunc (n @1)) > > > However, using the comment from the manual about strings, I > prepended the reference with "$" ... > > | 10.3 | 9 | -18 | a | 14 | 11 | 1 | > | ok | ok | ok | ok | ok | ok | ok | > > #+TBLFM: @2='(org-sbe mytestfunc (n $@1)) > > ... which now looks OK ;-) > > > So, back to the initial situation: what is my error or do we have a > bug in Org? > > > [1] > https://www.reddit.com/r/orgmode/comments/b0ll1v/embedding_python_code_in_table_formula/ I hope this helps, I'm on orgmode 8.2.1 here. Cheers, Daniel
[O] org-sbe: error when passing strings as parameters to/from Python blocks
Hi! I want to test/use Python with org-sbe: #+NAME: classificationfm #+BEGIN_SRC python :exports none :var prob :var impact result = "" if prob == 'high' and impact == 'high': return 'A' if prob == 'low' and impact == 'high': return 'B' if prob == 'high' and impact == 'low': return 'C' if prob == 'low' and impact == 'low': return 'D' return 'undefined' #+END_SRC (Yes, I should move to elif and the Python code might be coded with less characters in general: this should not be the point here ;-) ) | prob | impact | class | |--++| | high | high | #ERROR | | low | high | #ERROR | | high | low| #ERROR | | low | low| #ERROR | #+TBLFM: @2$3..@>$3='(org-sbe "classificationfm" (prob $1) (impact $2)) I'd expect to get the values of the "class" table column: A, B, C, D instead of #ERROR. Reading the manual, I found: | NOTE: By default, string variable names are interpreted as | references to source-code blocks, to force interpretation of a | cell’s value as a string, prefix the identifier a "$" (e.g.,"$$2" | instead of "$2" or "$@2$2" instead of "@2$2"). Therefore, I tried the following lines ... #+TBLFM: @2$3..@>$3='(org-sbe "classificationfm" (prob "$1") (impact "$2")) #+TBLFM: @2$3..@>$3='(org-sbe "classificationfm" (prob $$1) (impact $$2)) #+TBLFM: @2$3..@>$3='(org-sbe "classificationfm" (prob "$$1") (impact "$$2")) ... all with same error in the result. My setup: Org mode version 9.1.6 on GNU Emacs 26.0.90 and GNU Emacs 25.1.1 I started a reddit thread[1]. In this thread, somebody was posting this table showing the error: #+NAME: myfunc #+BEGIN_SRC python :var n="1" return "ok" #+END_SRC | 10.3 | 9 | -18 | a | 14 | 11 | 1 | | ok | ok | ok | #ERROR | ok | ok | ok | #+TBLFM: @2='(org-sbe myfunc (n @1)) However, using the comment from the manual about strings, I prepended the reference with "$" ... | 10.3 | 9 | -18 | a | 14 | 11 | 1 | | ok | ok | ok | ok | ok | ok | ok | #+TBLFM: @2='(org-sbe mytestfunc (n $@1)) ... which now looks OK ;-) So, back to the initial situation: what is my error or do we have a bug in Org? [1] https://www.reddit.com/r/orgmode/comments/b0ll1v/embedding_python_code_in_table_formula/ -- get mail|git|SVN|photos|postings|SMS|phonecalls|RSS|CSV|XML into Org-mode: > get Memacs from https://github.com/novoid/Memacs < Personal Information Management > http://Karl-Voit.at/tags/pim/ Emacs-related > http://Karl-Voit.at/tags/emacs/