emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
* org-sbe: error when passing strings as parameters to/from Python blocks
@ 2019-03-14  9:26 Karl Voit
  2019-03-14 10:53 ` Daniel Herzig
  0 siblings, 1 reply; 4+ messages in thread
From: Karl Voit @ 2019-03-14  9:26 UTC (permalink / raw)
  To: emacs-orgmode

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/

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: org-sbe: error when passing strings as parameters to/from Python blocks
  2019-03-14  9:26 org-sbe: error when passing strings as parameters to/from Python blocks Karl Voit
@ 2019-03-14 10:53 ` Daniel Herzig
  2019-03-14 12:27   ` [bug] " Karl Voit
  0 siblings, 1 reply; 4+ messages in thread
From: Daniel Herzig @ 2019-03-14 10:53 UTC (permalink / raw)
  To: Karl Voit; +Cc: emacs-orgmode@gnu.org

Karl Voit <devnull@Karl-Voit.at> 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

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [bug] org-sbe: error when passing strings as parameters to/from Python blocks
  2019-03-14 10:53 ` Daniel Herzig
@ 2019-03-14 12:27   ` Karl Voit
  2019-03-14 15:37     ` Karl Voit
  0 siblings, 1 reply; 4+ messages in thread
From: Karl Voit @ 2019-03-14 12:27 UTC (permalink / raw)
  To: emacs-orgmode

Hi Daniel,

* Daniel Herzig <daniel.herzig@outlook.at> wrote:
> Karl Voit <devnull@Karl-Voit.at> 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?)

-- 
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/

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: org-sbe: error when passing strings as parameters to/from Python blocks
  2019-03-14 12:27   ` [bug] " Karl Voit
@ 2019-03-14 15:37     ` Karl Voit
  0 siblings, 0 replies; 4+ messages in thread
From: Karl Voit @ 2019-03-14 15:37 UTC (permalink / raw)
  To: emacs-orgmode

* Karl Voit <devnull@Karl-Voit.at> wrote:
>
> * Daniel Herzig <daniel.herzig@outlook.at> wrote:
>> Karl Voit <devnull@Karl-Voit.at> 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/

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2019-03-14 15:37 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-03-14  9:26 org-sbe: error when passing strings as parameters to/from Python blocks Karl Voit
2019-03-14 10:53 ` Daniel Herzig
2019-03-14 12:27   ` [bug] " Karl Voit
2019-03-14 15:37     ` Karl Voit

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).