Opened 6 years ago

Last modified 5 years ago

## #17558 new defect

# pickled function loses its args

Reported by: | wonder | Owned by: | |
---|---|---|---|

Priority: | major | Milestone: | sage-6.4 |

Component: | pickling | Keywords: | |

Cc: | Merged in: | ||

Authors: | Reviewers: | ||

Report Upstream: | N/A | Work issues: | |

Branch: | Commit: | ||

Dependencies: | Stopgaps: |

### Description

The pickle process appears to forget whether an expression is a function.

sage: var('u_0 u_1') (u_0, u_1) sage: f2u = (1 - u_0).function(u_0, u_1) sage: f2u(x,y) -x + 1 sage: f2 = loads(dumps(f2u)) sage: f2(x,y) --------------------------------------------------------------------------- ValueError Traceback (most recent call last) /usr/local/src/jekyll-research/wmd_files/Selection_Gradients/maclev-2-2-adap.sage.py in <module>() ----> 1 f2(x,y) /usr/local/sage/local/lib/python2.7/site-packages/sage/symbolic/expression.so in sage.symbolic.expression.Expression.__call__ (build/cythonized/sage/symbolic/expression.cpp:24669)() /usr/local/sage/local/lib/python2.7/site-packages/sage/symbolic/ring.so in sage.symbolic.ring.SymbolicRing._call_element_ (build/cythonized/sage/symbolic/ring.cpp:8970)() ValueError: the number of arguments must be less than or equal to 1 sage: f2u (u_0, u_1) |--> -u_0 + 1 sage: f2 -u_0 + 1

Since I'm using a modular program design with intermediate results in .sobj files, this (along with some other bugs I've reported) is making it inconvenient for me to work with functions...

### Change History (3)

### comment:1 follow-up: ↓ 2 Changed 6 years ago by

### comment:2 in reply to: ↑ 1 Changed 6 years ago by

Replying to wonder:

Possibly related to #17503 (pickled symbolic function breaks maxima interface)

Indeed, I suspect it's related in the sense that pickling of symbolic expressions seems to rely entirely one Pynac serialization and doesn't take into account the properties of the python objects involved. In particular, the difference between a callable and a normal symbolic expression seems to lie entirely in the parent:

sage: var('u_0 u_1 x y') (u_0, u_1, x, y) sage: f2u = (1 - u_0).function(u_0, u_1) sage: parent(f2u) Callable function ring with arguments (u_0, u_1) sage: parent(f2u(u_0,u_1)) Symbolic Ring sage: f2u(u_0,u_1).__reduce_ex__(2) == f2u.__reduce_ex__(2) #this confirms that they pickle to the same. True

### comment:3 Changed 6 years ago by

Yeah, I guess this is what I get for being the only person who uses `save_session()`

for intermediate results, rather than notebooks :)

**Note:**See TracTickets for help on using tickets.

Possibly related to #17503 (pickled symbolic function breaks maxima interface)