passagemath-objects 10.6.46__cp314-cp314t-macosx_13_0_x86_64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of passagemath-objects might be problematic. Click here for more details.

Files changed (280) hide show
  1. passagemath_objects/.dylibs/libgmp.10.dylib +0 -0
  2. passagemath_objects/__init__.py +3 -0
  3. passagemath_objects-10.6.46.dist-info/METADATA +115 -0
  4. passagemath_objects-10.6.46.dist-info/RECORD +280 -0
  5. passagemath_objects-10.6.46.dist-info/WHEEL +6 -0
  6. passagemath_objects-10.6.46.dist-info/top_level.txt +3 -0
  7. sage/all__sagemath_objects.py +37 -0
  8. sage/arith/all__sagemath_objects.py +5 -0
  9. sage/arith/long.pxd +411 -0
  10. sage/arith/numerical_approx.cpython-314t-darwin.so +0 -0
  11. sage/arith/numerical_approx.pxd +35 -0
  12. sage/arith/numerical_approx.pyx +75 -0
  13. sage/arith/power.cpython-314t-darwin.so +0 -0
  14. sage/arith/power.pxd +31 -0
  15. sage/arith/power.pyx +127 -0
  16. sage/categories/action.cpython-314t-darwin.so +0 -0
  17. sage/categories/action.pxd +29 -0
  18. sage/categories/action.pyx +641 -0
  19. sage/categories/algebra_functor.py +745 -0
  20. sage/categories/all__sagemath_objects.py +33 -0
  21. sage/categories/basic.py +62 -0
  22. sage/categories/cartesian_product.py +295 -0
  23. sage/categories/category.py +3401 -0
  24. sage/categories/category_cy_helper.cpython-314t-darwin.so +0 -0
  25. sage/categories/category_cy_helper.pxd +8 -0
  26. sage/categories/category_cy_helper.pyx +322 -0
  27. sage/categories/category_singleton.cpython-314t-darwin.so +0 -0
  28. sage/categories/category_singleton.pxd +3 -0
  29. sage/categories/category_singleton.pyx +342 -0
  30. sage/categories/category_types.py +637 -0
  31. sage/categories/category_with_axiom.py +2876 -0
  32. sage/categories/covariant_functorial_construction.py +703 -0
  33. sage/categories/facade_sets.py +228 -0
  34. sage/categories/functor.cpython-314t-darwin.so +0 -0
  35. sage/categories/functor.pxd +7 -0
  36. sage/categories/functor.pyx +691 -0
  37. sage/categories/homset.py +1338 -0
  38. sage/categories/homsets.py +364 -0
  39. sage/categories/isomorphic_objects.py +73 -0
  40. sage/categories/map.cpython-314t-darwin.so +0 -0
  41. sage/categories/map.pxd +34 -0
  42. sage/categories/map.pyx +2106 -0
  43. sage/categories/morphism.cpython-314t-darwin.so +0 -0
  44. sage/categories/morphism.pxd +14 -0
  45. sage/categories/morphism.pyx +895 -0
  46. sage/categories/objects.py +167 -0
  47. sage/categories/primer.py +1696 -0
  48. sage/categories/pushout.py +4834 -0
  49. sage/categories/quotients.py +64 -0
  50. sage/categories/realizations.py +200 -0
  51. sage/categories/sets_cat.py +3290 -0
  52. sage/categories/sets_with_partial_maps.py +52 -0
  53. sage/categories/subobjects.py +64 -0
  54. sage/categories/subquotients.py +21 -0
  55. sage/categories/with_realizations.py +311 -0
  56. sage/cpython/__init__.py +19 -0
  57. sage/cpython/_py2_random.py +619 -0
  58. sage/cpython/all.py +3 -0
  59. sage/cpython/atexit.cpython-314t-darwin.so +0 -0
  60. sage/cpython/atexit.pyx +269 -0
  61. sage/cpython/builtin_types.cpython-314t-darwin.so +0 -0
  62. sage/cpython/builtin_types.pyx +7 -0
  63. sage/cpython/cython_metaclass.cpython-314t-darwin.so +0 -0
  64. sage/cpython/cython_metaclass.h +117 -0
  65. sage/cpython/cython_metaclass.pxd +3 -0
  66. sage/cpython/cython_metaclass.pyx +130 -0
  67. sage/cpython/debug.cpython-314t-darwin.so +0 -0
  68. sage/cpython/debug.pyx +302 -0
  69. sage/cpython/dict_del_by_value.cpython-314t-darwin.so +0 -0
  70. sage/cpython/dict_del_by_value.pxd +9 -0
  71. sage/cpython/dict_del_by_value.pyx +191 -0
  72. sage/cpython/dict_internal.h +245 -0
  73. sage/cpython/getattr.cpython-314t-darwin.so +0 -0
  74. sage/cpython/getattr.pxd +9 -0
  75. sage/cpython/getattr.pyx +439 -0
  76. sage/cpython/pycore_long.h +97 -0
  77. sage/cpython/pycore_long.pxd +10 -0
  78. sage/cpython/python_debug.h +44 -0
  79. sage/cpython/python_debug.pxd +47 -0
  80. sage/cpython/pyx_visit.h +13 -0
  81. sage/cpython/string.cpython-314t-darwin.so +0 -0
  82. sage/cpython/string.pxd +76 -0
  83. sage/cpython/string.pyx +34 -0
  84. sage/cpython/string_impl.h +60 -0
  85. sage/cpython/type.cpython-314t-darwin.so +0 -0
  86. sage/cpython/type.pxd +2 -0
  87. sage/cpython/type.pyx +40 -0
  88. sage/cpython/wrapperdescr.pxd +67 -0
  89. sage/ext/all__sagemath_objects.py +3 -0
  90. sage/ext/ccobject.h +64 -0
  91. sage/ext/cplusplus.pxd +17 -0
  92. sage/ext/mod_int.h +30 -0
  93. sage/ext/mod_int.pxd +24 -0
  94. sage/ext/stdsage.pxd +39 -0
  95. sage/groups/all__sagemath_objects.py +1 -0
  96. sage/groups/group.cpython-314t-darwin.so +0 -0
  97. sage/groups/group.pxd +14 -0
  98. sage/groups/group.pyx +322 -0
  99. sage/groups/old.cpython-314t-darwin.so +0 -0
  100. sage/groups/old.pxd +14 -0
  101. sage/groups/old.pyx +219 -0
  102. sage/libs/all__sagemath_objects.py +3 -0
  103. sage/libs/gmp/__init__.py +1 -0
  104. sage/libs/gmp/all.pxd +6 -0
  105. sage/libs/gmp/binop.pxd +23 -0
  106. sage/libs/gmp/misc.pxd +8 -0
  107. sage/libs/gmp/mpf.pxd +88 -0
  108. sage/libs/gmp/mpn.pxd +57 -0
  109. sage/libs/gmp/mpq.pxd +57 -0
  110. sage/libs/gmp/mpz.pxd +202 -0
  111. sage/libs/gmp/pylong.cpython-314t-darwin.so +0 -0
  112. sage/libs/gmp/pylong.pxd +12 -0
  113. sage/libs/gmp/pylong.pyx +150 -0
  114. sage/libs/gmp/random.pxd +25 -0
  115. sage/libs/gmp/randomize.pxd +59 -0
  116. sage/libs/gmp/types.pxd +53 -0
  117. sage/libs/gmpxx.pxd +19 -0
  118. sage/misc/abstract_method.py +276 -0
  119. sage/misc/all__sagemath_objects.py +43 -0
  120. sage/misc/bindable_class.py +253 -0
  121. sage/misc/c3_controlled.cpython-314t-darwin.so +0 -0
  122. sage/misc/c3_controlled.pxd +2 -0
  123. sage/misc/c3_controlled.pyx +1402 -0
  124. sage/misc/cachefunc.cpython-314t-darwin.so +0 -0
  125. sage/misc/cachefunc.pxd +43 -0
  126. sage/misc/cachefunc.pyx +3781 -0
  127. sage/misc/call.py +188 -0
  128. sage/misc/classcall_metaclass.cpython-314t-darwin.so +0 -0
  129. sage/misc/classcall_metaclass.pxd +14 -0
  130. sage/misc/classcall_metaclass.pyx +599 -0
  131. sage/misc/constant_function.cpython-314t-darwin.so +0 -0
  132. sage/misc/constant_function.pyx +130 -0
  133. sage/misc/decorators.py +747 -0
  134. sage/misc/fast_methods.cpython-314t-darwin.so +0 -0
  135. sage/misc/fast_methods.pxd +20 -0
  136. sage/misc/fast_methods.pyx +351 -0
  137. sage/misc/flatten.py +90 -0
  138. sage/misc/fpickle.cpython-314t-darwin.so +0 -0
  139. sage/misc/fpickle.pyx +177 -0
  140. sage/misc/function_mangling.cpython-314t-darwin.so +0 -0
  141. sage/misc/function_mangling.pxd +11 -0
  142. sage/misc/function_mangling.pyx +308 -0
  143. sage/misc/inherit_comparison.cpython-314t-darwin.so +0 -0
  144. sage/misc/inherit_comparison.pxd +5 -0
  145. sage/misc/inherit_comparison.pyx +105 -0
  146. sage/misc/instancedoc.cpython-314t-darwin.so +0 -0
  147. sage/misc/instancedoc.pyx +331 -0
  148. sage/misc/lazy_attribute.cpython-314t-darwin.so +0 -0
  149. sage/misc/lazy_attribute.pyx +607 -0
  150. sage/misc/lazy_format.py +135 -0
  151. sage/misc/lazy_import.cpython-314t-darwin.so +0 -0
  152. sage/misc/lazy_import.pyx +1299 -0
  153. sage/misc/lazy_import_cache.py +36 -0
  154. sage/misc/lazy_list.cpython-314t-darwin.so +0 -0
  155. sage/misc/lazy_list.pxd +19 -0
  156. sage/misc/lazy_list.pyx +1187 -0
  157. sage/misc/lazy_string.cpython-314t-darwin.so +0 -0
  158. sage/misc/lazy_string.pxd +7 -0
  159. sage/misc/lazy_string.pyx +546 -0
  160. sage/misc/misc.py +1066 -0
  161. sage/misc/misc_c.cpython-314t-darwin.so +0 -0
  162. sage/misc/misc_c.pxd +3 -0
  163. sage/misc/misc_c.pyx +766 -0
  164. sage/misc/namespace_package.py +37 -0
  165. sage/misc/nested_class.cpython-314t-darwin.so +0 -0
  166. sage/misc/nested_class.pxd +3 -0
  167. sage/misc/nested_class.pyx +394 -0
  168. sage/misc/persist.cpython-314t-darwin.so +0 -0
  169. sage/misc/persist.pyx +1251 -0
  170. sage/misc/prandom.py +418 -0
  171. sage/misc/randstate.cpython-314t-darwin.so +0 -0
  172. sage/misc/randstate.pxd +30 -0
  173. sage/misc/randstate.pyx +1059 -0
  174. sage/misc/repr.py +203 -0
  175. sage/misc/reset.cpython-314t-darwin.so +0 -0
  176. sage/misc/reset.pyx +196 -0
  177. sage/misc/sage_ostools.cpython-314t-darwin.so +0 -0
  178. sage/misc/sage_ostools.pyx +323 -0
  179. sage/misc/sage_timeit.py +275 -0
  180. sage/misc/sage_timeit_class.cpython-314t-darwin.so +0 -0
  181. sage/misc/sage_timeit_class.pyx +120 -0
  182. sage/misc/sage_unittest.py +637 -0
  183. sage/misc/sageinspect.py +2768 -0
  184. sage/misc/session.cpython-314t-darwin.so +0 -0
  185. sage/misc/session.pyx +392 -0
  186. sage/misc/superseded.py +557 -0
  187. sage/misc/test_nested_class.py +228 -0
  188. sage/misc/timing.py +264 -0
  189. sage/misc/unknown.py +222 -0
  190. sage/misc/verbose.py +253 -0
  191. sage/misc/weak_dict.cpython-314t-darwin.so +0 -0
  192. sage/misc/weak_dict.pxd +15 -0
  193. sage/misc/weak_dict.pyx +1231 -0
  194. sage/modules/all__sagemath_objects.py +1 -0
  195. sage/modules/module.cpython-314t-darwin.so +0 -0
  196. sage/modules/module.pxd +5 -0
  197. sage/modules/module.pyx +329 -0
  198. sage/rings/all__sagemath_objects.py +3 -0
  199. sage/rings/integer_fake.h +22 -0
  200. sage/rings/integer_fake.pxd +55 -0
  201. sage/sets/all__sagemath_objects.py +3 -0
  202. sage/sets/pythonclass.cpython-314t-darwin.so +0 -0
  203. sage/sets/pythonclass.pxd +9 -0
  204. sage/sets/pythonclass.pyx +247 -0
  205. sage/structure/__init__.py +4 -0
  206. sage/structure/all.py +30 -0
  207. sage/structure/category_object.cpython-314t-darwin.so +0 -0
  208. sage/structure/category_object.pxd +28 -0
  209. sage/structure/category_object.pyx +1087 -0
  210. sage/structure/coerce.cpython-314t-darwin.so +0 -0
  211. sage/structure/coerce.pxd +44 -0
  212. sage/structure/coerce.pyx +2107 -0
  213. sage/structure/coerce_actions.cpython-314t-darwin.so +0 -0
  214. sage/structure/coerce_actions.pxd +27 -0
  215. sage/structure/coerce_actions.pyx +988 -0
  216. sage/structure/coerce_dict.cpython-314t-darwin.so +0 -0
  217. sage/structure/coerce_dict.pxd +51 -0
  218. sage/structure/coerce_dict.pyx +1557 -0
  219. sage/structure/coerce_exceptions.py +23 -0
  220. sage/structure/coerce_maps.cpython-314t-darwin.so +0 -0
  221. sage/structure/coerce_maps.pxd +28 -0
  222. sage/structure/coerce_maps.pyx +718 -0
  223. sage/structure/debug_options.cpython-314t-darwin.so +0 -0
  224. sage/structure/debug_options.pxd +6 -0
  225. sage/structure/debug_options.pyx +54 -0
  226. sage/structure/dynamic_class.py +541 -0
  227. sage/structure/element.cpython-314t-darwin.so +0 -0
  228. sage/structure/element.pxd +272 -0
  229. sage/structure/element.pyx +4772 -0
  230. sage/structure/element_wrapper.cpython-314t-darwin.so +0 -0
  231. sage/structure/element_wrapper.pxd +12 -0
  232. sage/structure/element_wrapper.pyx +582 -0
  233. sage/structure/factorization.py +1422 -0
  234. sage/structure/factorization_integer.py +105 -0
  235. sage/structure/factory.cpython-314t-darwin.so +0 -0
  236. sage/structure/factory.pyx +786 -0
  237. sage/structure/formal_sum.py +489 -0
  238. sage/structure/gens_py.py +73 -0
  239. sage/structure/global_options.py +1743 -0
  240. sage/structure/indexed_generators.py +863 -0
  241. sage/structure/list_clone.cpython-314t-darwin.so +0 -0
  242. sage/structure/list_clone.pxd +65 -0
  243. sage/structure/list_clone.pyx +1867 -0
  244. sage/structure/list_clone_demo.cpython-314t-darwin.so +0 -0
  245. sage/structure/list_clone_demo.pyx +248 -0
  246. sage/structure/list_clone_timings.py +179 -0
  247. sage/structure/list_clone_timings_cy.cpython-314t-darwin.so +0 -0
  248. sage/structure/list_clone_timings_cy.pyx +86 -0
  249. sage/structure/mutability.cpython-314t-darwin.so +0 -0
  250. sage/structure/mutability.pxd +21 -0
  251. sage/structure/mutability.pyx +348 -0
  252. sage/structure/nonexact.py +69 -0
  253. sage/structure/parent.cpython-314t-darwin.so +0 -0
  254. sage/structure/parent.pxd +112 -0
  255. sage/structure/parent.pyx +3093 -0
  256. sage/structure/parent_base.cpython-314t-darwin.so +0 -0
  257. sage/structure/parent_base.pxd +13 -0
  258. sage/structure/parent_base.pyx +44 -0
  259. sage/structure/parent_gens.cpython-314t-darwin.so +0 -0
  260. sage/structure/parent_gens.pxd +22 -0
  261. sage/structure/parent_gens.pyx +377 -0
  262. sage/structure/parent_old.cpython-314t-darwin.so +0 -0
  263. sage/structure/parent_old.pxd +25 -0
  264. sage/structure/parent_old.pyx +294 -0
  265. sage/structure/proof/__init__.py +1 -0
  266. sage/structure/proof/all.py +243 -0
  267. sage/structure/proof/proof.py +300 -0
  268. sage/structure/richcmp.cpython-314t-darwin.so +0 -0
  269. sage/structure/richcmp.pxd +213 -0
  270. sage/structure/richcmp.pyx +495 -0
  271. sage/structure/sage_object.cpython-314t-darwin.so +0 -0
  272. sage/structure/sage_object.pxd +3 -0
  273. sage/structure/sage_object.pyx +988 -0
  274. sage/structure/sage_object_test.py +19 -0
  275. sage/structure/sequence.py +937 -0
  276. sage/structure/set_factories.py +1178 -0
  277. sage/structure/set_factories_example.py +527 -0
  278. sage/structure/support_view.py +179 -0
  279. sage/structure/test_factory.py +56 -0
  280. sage/structure/unique_representation.py +1359 -0
Binary file
sage/misc/session.pyx ADDED
@@ -0,0 +1,392 @@
1
+ # sage_setup: distribution = sagemath-objects
2
+ r"""
3
+ Loading and saving sessions and listing all variables
4
+
5
+ EXAMPLES:
6
+
7
+ We reset the current session, then define a rational number ``2/3``, and
8
+ verify that it is listed as a newly defined variable::
9
+
10
+ sage: reset()
11
+ sage: w = 2/3; w
12
+ 2/3
13
+ sage: show_identifiers()
14
+ ['w']
15
+
16
+ We next save this session. We are using a temporary directory to hold
17
+ the session file but we do this *for testing only.* Please do not do
18
+ this if you want to save your session permanently. Also note that
19
+ the ``tempfile`` module weasels its way into the session::
20
+
21
+ ::
22
+
23
+ sage: from tempfile import TemporaryDirectory
24
+ sage: d = TemporaryDirectory()
25
+ sage: save_session(os.path.join(d.name, 'session'))
26
+
27
+ This saves a dictionary with ``w`` as one of the keys::
28
+
29
+ sage: z = load(os.path.join(d.name, 'session'))
30
+ sage: list(z)
31
+ ['w', 'd']
32
+ sage: z['w']
33
+ 2/3
34
+
35
+ Next we reset all variables in the session except for the temporary
36
+ directory name. We verify that the session is reset, and then load
37
+ it back.::
38
+
39
+ sage: sage.misc.reset.EXCLUDE.add('d')
40
+ sage: reset()
41
+ sage: show_identifiers()
42
+ ['d']
43
+ sage: load_session(os.path.join(d.name, 'session'))
44
+
45
+ Indeed ``w`` is now defined again.::
46
+
47
+ sage: show_identifiers()
48
+ ['d', 'w']
49
+ sage: w
50
+ 2/3
51
+
52
+ Finally, we clean up the temporary directory::
53
+
54
+ sage: d.cleanup()
55
+
56
+ AUTHOR:
57
+
58
+ - William Stein
59
+ """
60
+
61
+ #############################################################################
62
+ # Copyright (C) 2007,2010 William Stein <wstein@gmail.com>
63
+ # Distributed under the terms of the GNU General Public License (GPL)
64
+ # The full text of the GPL is available at:
65
+ # https://www.gnu.org/licenses/
66
+ #############################################################################
67
+
68
+ # Standard python imports
69
+ import builtins
70
+ import types
71
+
72
+ # Sage imports
73
+ from sage.misc.persist import load, save, loads, dumps
74
+ from sage.misc.lazy_import import LazyImport
75
+
76
+ # We want the caller's locals, but locals() is emulated in Cython
77
+ cdef caller_locals = builtins.locals
78
+
79
+ # This module-scope variables is used to save the
80
+ # global state of the sage environment at the moment
81
+ # before the user starts typing or running code.
82
+
83
+ state_at_init = None
84
+
85
+
86
+ def init(state=None):
87
+ """
88
+ Initialize some dictionaries needed by the :func:`show_identifiers`,
89
+ :func:`save_session`, and :func:`load_session` functions.
90
+
91
+ INPUT:
92
+
93
+ - ``state`` -- dictionary or ``None``; if ``None`` the :func:`locals()`
94
+ of the caller is used
95
+
96
+ EXAMPLES::
97
+
98
+ sage: reset()
99
+ sage: w = 10
100
+ sage: show_identifiers()
101
+ ['w']
102
+
103
+ When we call :func:`init()` below it reinitializes the internal table, so
104
+ the ``w`` we just defined doesn't count as a new identifier::
105
+
106
+ sage: sage.misc.session.init()
107
+ sage: show_identifiers()
108
+ []
109
+ """
110
+ if state is None:
111
+ state = caller_locals() # use locals() by default
112
+ global state_at_init
113
+ # Make a *copy* of the state dict, since it is mutable
114
+ state_at_init = dict(state)
115
+
116
+
117
+ def _is_new_var(x, v, hidden):
118
+ """
119
+ Return whether or not the variable named ``x`` with value ``v`` is
120
+ considered newly defined in the current session.
121
+
122
+ INPUT:
123
+
124
+ - ``x`` -- string
125
+
126
+ - ``v`` -- object
127
+
128
+ - ``hidden`` -- boolean; if ``True``, always return ``False`` on variables
129
+ that start with ``_``
130
+
131
+ OUTPUT: boolean
132
+
133
+ EXAMPLES:
134
+
135
+ We reset the session, then check whether the builtin factor function
136
+ is newly defined (it isn't)::
137
+
138
+ sage: reset()
139
+ sage: sage.misc.session._is_new_var('factor', factor, True)
140
+ False
141
+
142
+ We then redefine factor, and find that it is newly defined::
143
+
144
+ sage: factor = 10
145
+ sage: sage.misc.session._is_new_var('factor', factor, True)
146
+ True
147
+
148
+ We define a new variable ``'blue'``, and test::
149
+
150
+ sage: blue = 10
151
+ sage: sage.misc.session._is_new_var('blue', blue, True)
152
+ True
153
+ sage: sage.misc.session._is_new_var('_blue', blue, True)
154
+ True
155
+ sage: sage.misc.session._is_new_var('_blue', blue, False)
156
+ False
157
+ """
158
+ # We ignore all _ variable names unless hidden is True
159
+ if not hidden and x.startswith('_'):
160
+ return False
161
+ # If a variable names was not there at init time then it is
162
+ # definitely new.
163
+ if x not in state_at_init:
164
+ return True
165
+ # A lazy import that was there at init time is not new
166
+ if isinstance(v, LazyImport):
167
+ return False
168
+ # A variable could also be new even if it was there at init, say if
169
+ # its value changed.
170
+ return state_at_init[x] is not v
171
+
172
+
173
+ def show_identifiers(hidden=False):
174
+ r"""
175
+ Return a list of all variable names that have been defined during
176
+ this session. By default, this returns only those identifiers
177
+ that don't start with an underscore.
178
+
179
+ INPUT:
180
+
181
+ - ``hidden`` -- boolean (default: ``False``); if ``True``, also return
182
+ identifiers that start with an underscore
183
+
184
+ OUTPUT: list of variable names
185
+
186
+ EXAMPLES:
187
+
188
+ We reset the state of all variables, and see that none are defined::
189
+
190
+ sage: reset()
191
+ sage: show_identifiers()
192
+ []
193
+
194
+ We then define two variables, one which overwrites the default factor
195
+ function; both are shown by :func:`show_identifiers()`::
196
+
197
+ sage: a = 10
198
+ sage: factor = 20
199
+ sage: show_identifiers()
200
+ ['factor', 'a']
201
+
202
+ To get the actual value of a variable from the list, use the
203
+ :func:`globals()` function.::
204
+
205
+ sage: globals()['factor']
206
+ 20
207
+
208
+ By default :func:`show_identifiers()` only returns variables that
209
+ don't start with an underscore. There is an option hidden that
210
+ allows one to list those as well::
211
+
212
+ sage: _hello = 10
213
+ sage: show_identifiers()
214
+ ['factor', 'a']
215
+ sage: '_hello' in show_identifiers(hidden=True)
216
+ True
217
+
218
+ Many of the hidden variables are part of the IPython command history, at
219
+ least in command line mode.::
220
+
221
+ sage: show_identifiers(hidden=True) # random output
222
+ ['__builtin__', '_ih', '_oh', '_dh', 'exit', 'quit', '_', '__', '___',
223
+ '_i', '_ii', '_iii', '_i1', 'factor', '_i2', '_2', '_i3', 'a', '_i4',
224
+ '_i5', '_5', '_i6', '_6', '_i7', '_hello', '_i8', '_8', '_i9', '_9',
225
+ '_i10']
226
+ """
227
+ state = caller_locals()
228
+ return [x for x, v in state.items() if _is_new_var(x, v, hidden)]
229
+
230
+
231
+ def save_session(name='sage_session', verbose=False):
232
+ r"""
233
+ Save all variables that can be saved to the given filename. The
234
+ variables will be saved to a dictionary, which can be loaded using
235
+ ``load(name)`` or :func:`load_session`.
236
+
237
+ .. NOTE::
238
+
239
+ 1. Function and anything else that can't be pickled is not
240
+ saved. This failure is silent unless you set
241
+ ``verbose=True``.
242
+
243
+ 2. One can still make sessions that can't be reloaded. E.g., define
244
+ a class with::
245
+
246
+ class Foo: pass
247
+
248
+ and make an instance with::
249
+
250
+ f = Foo()
251
+
252
+ Then :func:`save_session` followed by ``quit`` and
253
+ :func:`load_session` fails. I doubt there is any good way to
254
+ deal with this. Fortunately, one can simply re-evaluate the
255
+ code to define ``Foo``, and suddenly :func:`load_session`
256
+ works fine.
257
+
258
+ INPUT:
259
+
260
+ - ``name`` -- string (default: ``'sage_session'``); name of ``sobj``
261
+ to save the session to
262
+
263
+ - ``verbose`` -- boolean (default: ``False``); if ``True``, print
264
+ info about why certain variables can't be saved
265
+
266
+ OUTPUT: creates a file and returns silently
267
+
268
+ EXAMPLES:
269
+
270
+ For testing, we use a temporary file that will be removed as soon
271
+ as Sage is left. Of course, for permanently saving your session,
272
+ you should choose a permanent file.
273
+
274
+ ::
275
+
276
+ sage: a = 5
277
+ sage: tmp_f = tmp_filename()
278
+ sage: save_session(tmp_f)
279
+ sage: del a
280
+ sage: load_session(tmp_f)
281
+ sage: print(a)
282
+ 5
283
+
284
+ We illustrate what happens when one of the variables is a function::
285
+
286
+ sage: f = lambda x : x^2
287
+ sage: save_session(tmp_f)
288
+ sage: save_session(tmp_f, verbose=True)
289
+ ...
290
+ Not saving f: f is a function or method
291
+
292
+ Something similar happens for cython-defined functions::
293
+
294
+ sage: # needs sage.misc.cython
295
+ sage: g = cython_lambda('double x', 'x*x + 1.5')
296
+ sage: save_session(tmp_f, verbose=True)
297
+ ...
298
+ Not saving g: g is a cython function or method
299
+
300
+ And the same for a lazy import::
301
+
302
+ sage: from sage.misc.lazy_import import LazyImport
303
+ sage: lazy_ZZ = LazyImport('sage.rings.integer_ring', 'ZZ')
304
+ sage: save_session(tmp_f, verbose=True)
305
+ ...
306
+ Not saving lazy_ZZ: lazy_ZZ is a lazy import
307
+ """
308
+ state = caller_locals()
309
+ # This dict D will contain the session -- as a dict -- that we will save to disk.
310
+ D = {}
311
+ # We iterate only over the new variables that were defined in this
312
+ # session, since those are the only ones we will save.
313
+ for k in show_identifiers(hidden=True):
314
+ try:
315
+ x = state[k]
316
+
317
+ if isinstance(x, type):
318
+ raise TypeError('{} is a class or type'.format(k))
319
+
320
+ if isinstance(x, (types.FunctionType, types.BuiltinFunctionType, types.BuiltinMethodType)):
321
+ raise TypeError('{} is a function or method'.format(k))
322
+
323
+ if getattr(type(x), '__name__', None) == 'cython_function_or_method':
324
+ raise TypeError('{} is a cython function or method'.format(k))
325
+
326
+ if isinstance(x, LazyImport):
327
+ raise TypeError('{} is a lazy import'.format(k))
328
+
329
+ # We attempt to pickle *and* unpickle every variable to
330
+ # make *certain* that we can pickled D at the end below.
331
+ # This seems wasteful, but it guarantees (I hope) that
332
+ # D itself can be pickled and unpickled (assuming something
333
+ # doesn't change in the Sage library itself). Otherwise,
334
+ # we could easily pickle whole sessions but get something
335
+ # not at all useful.
336
+ _ = loads(dumps(x, False), False)
337
+ if verbose:
338
+ print("Saving %s" % k)
339
+ D[k] = x
340
+ except Exception as msg:
341
+ if verbose:
342
+ print("Not saving {}: {}".format(k, msg))
343
+ pass
344
+ save(D, name)
345
+
346
+
347
+ def load_session(name='sage_session', verbose=False):
348
+ r"""
349
+ Load a saved session.
350
+
351
+ This merges in all variables from a previously saved session. It
352
+ does not clear out the variables in the current sessions, unless
353
+ they are overwritten. You can thus merge multiple sessions, and
354
+ don't necessarily loose all your current work when you use this
355
+ command.
356
+
357
+ .. NOTE::
358
+
359
+ In the Sage notebook the session name is searched for both
360
+ in the current working cell and the ``DATA`` directory.
361
+
362
+ EXAMPLES::
363
+
364
+ sage: a = 5
365
+ sage: f = lambda x: x^2
366
+
367
+ For testing, we use a temporary file, that will be removed as soon
368
+ as Sage is left. Of course, for permanently saving your session,
369
+ you should choose a permanent file.
370
+
371
+ ::
372
+
373
+ sage: tmp_f = tmp_filename()
374
+ sage: save_session(tmp_f)
375
+ sage: del a; del f
376
+ sage: load_session(tmp_f)
377
+ sage: print(a)
378
+ 5
379
+
380
+ Note that ``f`` does not come back, since it is a function, hence
381
+ couldn't be saved::
382
+
383
+ sage: print(f)
384
+ Traceback (most recent call last):
385
+ ...
386
+ NameError: name 'f' is not defined
387
+ """
388
+ state = caller_locals()
389
+
390
+ D = load(name)
391
+ for k, x in D.items():
392
+ state[k] = x