passagemath-objects 10.6.41__cp312-cp312-win_amd64.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.
Files changed (281) hide show
  1. passagemath_objects/__init__.py +3 -0
  2. passagemath_objects-10.6.41.dist-info/DELVEWHEEL +2 -0
  3. passagemath_objects-10.6.41.dist-info/METADATA +115 -0
  4. passagemath_objects-10.6.41.dist-info/RECORD +281 -0
  5. passagemath_objects-10.6.41.dist-info/WHEEL +5 -0
  6. passagemath_objects-10.6.41.dist-info/top_level.txt +3 -0
  7. passagemath_objects.libs/libgmp-10-79b4110c7ea2b760f16cfef97e8a8a34.dll +0 -0
  8. sage/all__sagemath_objects.py +46 -0
  9. sage/arith/all__sagemath_objects.py +5 -0
  10. sage/arith/long.pxd +411 -0
  11. sage/arith/numerical_approx.cp312-win_amd64.pyd +0 -0
  12. sage/arith/numerical_approx.pxd +35 -0
  13. sage/arith/numerical_approx.pyx +75 -0
  14. sage/arith/power.cp312-win_amd64.pyd +0 -0
  15. sage/arith/power.pxd +31 -0
  16. sage/arith/power.pyx +127 -0
  17. sage/categories/action.cp312-win_amd64.pyd +0 -0
  18. sage/categories/action.pxd +29 -0
  19. sage/categories/action.pyx +641 -0
  20. sage/categories/algebra_functor.py +745 -0
  21. sage/categories/all__sagemath_objects.py +33 -0
  22. sage/categories/basic.py +71 -0
  23. sage/categories/cartesian_product.py +295 -0
  24. sage/categories/category.py +3401 -0
  25. sage/categories/category_cy_helper.cp312-win_amd64.pyd +0 -0
  26. sage/categories/category_cy_helper.pxd +8 -0
  27. sage/categories/category_cy_helper.pyx +322 -0
  28. sage/categories/category_singleton.cp312-win_amd64.pyd +0 -0
  29. sage/categories/category_singleton.pxd +3 -0
  30. sage/categories/category_singleton.pyx +342 -0
  31. sage/categories/category_types.py +637 -0
  32. sage/categories/category_with_axiom.py +2885 -0
  33. sage/categories/covariant_functorial_construction.py +703 -0
  34. sage/categories/facade_sets.py +228 -0
  35. sage/categories/functor.cp312-win_amd64.pyd +0 -0
  36. sage/categories/functor.pxd +7 -0
  37. sage/categories/functor.pyx +691 -0
  38. sage/categories/homset.py +1338 -0
  39. sage/categories/homsets.py +364 -0
  40. sage/categories/isomorphic_objects.py +73 -0
  41. sage/categories/map.cp312-win_amd64.pyd +0 -0
  42. sage/categories/map.pxd +34 -0
  43. sage/categories/map.pyx +2112 -0
  44. sage/categories/morphism.cp312-win_amd64.pyd +0 -0
  45. sage/categories/morphism.pxd +14 -0
  46. sage/categories/morphism.pyx +895 -0
  47. sage/categories/objects.py +167 -0
  48. sage/categories/primer.py +1696 -0
  49. sage/categories/pushout.py +4834 -0
  50. sage/categories/quotients.py +64 -0
  51. sage/categories/realizations.py +200 -0
  52. sage/categories/sets_cat.py +3228 -0
  53. sage/categories/sets_with_partial_maps.py +52 -0
  54. sage/categories/subobjects.py +64 -0
  55. sage/categories/subquotients.py +21 -0
  56. sage/categories/with_realizations.py +311 -0
  57. sage/cpython/__init__.py +28 -0
  58. sage/cpython/_py2_random.py +619 -0
  59. sage/cpython/all.py +3 -0
  60. sage/cpython/atexit.cp312-win_amd64.pyd +0 -0
  61. sage/cpython/atexit.pyx +269 -0
  62. sage/cpython/builtin_types.cp312-win_amd64.pyd +0 -0
  63. sage/cpython/builtin_types.pyx +7 -0
  64. sage/cpython/cython_metaclass.cp312-win_amd64.pyd +0 -0
  65. sage/cpython/cython_metaclass.h +117 -0
  66. sage/cpython/cython_metaclass.pxd +3 -0
  67. sage/cpython/cython_metaclass.pyx +130 -0
  68. sage/cpython/debug.cp312-win_amd64.pyd +0 -0
  69. sage/cpython/debug.pyx +302 -0
  70. sage/cpython/dict_del_by_value.cp312-win_amd64.pyd +0 -0
  71. sage/cpython/dict_del_by_value.pxd +9 -0
  72. sage/cpython/dict_del_by_value.pyx +191 -0
  73. sage/cpython/dict_internal.h +245 -0
  74. sage/cpython/getattr.cp312-win_amd64.pyd +0 -0
  75. sage/cpython/getattr.pxd +9 -0
  76. sage/cpython/getattr.pyx +439 -0
  77. sage/cpython/pycore_long.h +97 -0
  78. sage/cpython/pycore_long.pxd +10 -0
  79. sage/cpython/python_debug.h +44 -0
  80. sage/cpython/python_debug.pxd +47 -0
  81. sage/cpython/pyx_visit.h +13 -0
  82. sage/cpython/string.cp312-win_amd64.pyd +0 -0
  83. sage/cpython/string.pxd +76 -0
  84. sage/cpython/string.pyx +34 -0
  85. sage/cpython/string_impl.h +60 -0
  86. sage/cpython/type.cp312-win_amd64.pyd +0 -0
  87. sage/cpython/type.pxd +2 -0
  88. sage/cpython/type.pyx +40 -0
  89. sage/cpython/wrapperdescr.pxd +67 -0
  90. sage/ext/all__sagemath_objects.py +3 -0
  91. sage/ext/ccobject.h +64 -0
  92. sage/ext/cplusplus.pxd +17 -0
  93. sage/ext/mod_int.h +30 -0
  94. sage/ext/mod_int.pxd +24 -0
  95. sage/ext/stdsage.pxd +39 -0
  96. sage/groups/all__sagemath_objects.py +1 -0
  97. sage/groups/group.cp312-win_amd64.pyd +0 -0
  98. sage/groups/group.pxd +14 -0
  99. sage/groups/group.pyx +322 -0
  100. sage/groups/old.cp312-win_amd64.pyd +0 -0
  101. sage/groups/old.pxd +14 -0
  102. sage/groups/old.pyx +219 -0
  103. sage/libs/all__sagemath_objects.py +3 -0
  104. sage/libs/gmp/__init__.py +1 -0
  105. sage/libs/gmp/all.pxd +6 -0
  106. sage/libs/gmp/binop.pxd +23 -0
  107. sage/libs/gmp/misc.pxd +8 -0
  108. sage/libs/gmp/mpf.pxd +88 -0
  109. sage/libs/gmp/mpn.pxd +57 -0
  110. sage/libs/gmp/mpq.pxd +57 -0
  111. sage/libs/gmp/mpz.pxd +202 -0
  112. sage/libs/gmp/pylong.cp312-win_amd64.pyd +0 -0
  113. sage/libs/gmp/pylong.pxd +12 -0
  114. sage/libs/gmp/pylong.pyx +150 -0
  115. sage/libs/gmp/random.pxd +25 -0
  116. sage/libs/gmp/randomize.pxd +59 -0
  117. sage/libs/gmp/types.pxd +53 -0
  118. sage/libs/gmpxx.pxd +19 -0
  119. sage/misc/abstract_method.py +276 -0
  120. sage/misc/all__sagemath_objects.py +43 -0
  121. sage/misc/bindable_class.py +253 -0
  122. sage/misc/c3_controlled.cp312-win_amd64.pyd +0 -0
  123. sage/misc/c3_controlled.pxd +2 -0
  124. sage/misc/c3_controlled.pyx +1402 -0
  125. sage/misc/cachefunc.cp312-win_amd64.pyd +0 -0
  126. sage/misc/cachefunc.pxd +43 -0
  127. sage/misc/cachefunc.pyx +3781 -0
  128. sage/misc/call.py +188 -0
  129. sage/misc/classcall_metaclass.cp312-win_amd64.pyd +0 -0
  130. sage/misc/classcall_metaclass.pxd +14 -0
  131. sage/misc/classcall_metaclass.pyx +599 -0
  132. sage/misc/constant_function.cp312-win_amd64.pyd +0 -0
  133. sage/misc/constant_function.pyx +130 -0
  134. sage/misc/decorators.py +747 -0
  135. sage/misc/fast_methods.cp312-win_amd64.pyd +0 -0
  136. sage/misc/fast_methods.pxd +20 -0
  137. sage/misc/fast_methods.pyx +351 -0
  138. sage/misc/flatten.py +90 -0
  139. sage/misc/fpickle.cp312-win_amd64.pyd +0 -0
  140. sage/misc/fpickle.pyx +177 -0
  141. sage/misc/function_mangling.cp312-win_amd64.pyd +0 -0
  142. sage/misc/function_mangling.pxd +11 -0
  143. sage/misc/function_mangling.pyx +308 -0
  144. sage/misc/inherit_comparison.cp312-win_amd64.pyd +0 -0
  145. sage/misc/inherit_comparison.pxd +5 -0
  146. sage/misc/inherit_comparison.pyx +105 -0
  147. sage/misc/instancedoc.cp312-win_amd64.pyd +0 -0
  148. sage/misc/instancedoc.pyx +331 -0
  149. sage/misc/lazy_attribute.cp312-win_amd64.pyd +0 -0
  150. sage/misc/lazy_attribute.pyx +607 -0
  151. sage/misc/lazy_format.py +135 -0
  152. sage/misc/lazy_import.cp312-win_amd64.pyd +0 -0
  153. sage/misc/lazy_import.pyx +1299 -0
  154. sage/misc/lazy_import_cache.py +36 -0
  155. sage/misc/lazy_list.cp312-win_amd64.pyd +0 -0
  156. sage/misc/lazy_list.pxd +19 -0
  157. sage/misc/lazy_list.pyx +1187 -0
  158. sage/misc/lazy_string.cp312-win_amd64.pyd +0 -0
  159. sage/misc/lazy_string.pxd +7 -0
  160. sage/misc/lazy_string.pyx +546 -0
  161. sage/misc/misc.py +1066 -0
  162. sage/misc/misc_c.cp312-win_amd64.pyd +0 -0
  163. sage/misc/misc_c.pxd +3 -0
  164. sage/misc/misc_c.pyx +766 -0
  165. sage/misc/namespace_package.py +37 -0
  166. sage/misc/nested_class.cp312-win_amd64.pyd +0 -0
  167. sage/misc/nested_class.pxd +3 -0
  168. sage/misc/nested_class.pyx +394 -0
  169. sage/misc/persist.cp312-win_amd64.pyd +0 -0
  170. sage/misc/persist.pyx +1251 -0
  171. sage/misc/prandom.py +418 -0
  172. sage/misc/randstate.cp312-win_amd64.pyd +0 -0
  173. sage/misc/randstate.pxd +30 -0
  174. sage/misc/randstate.pyx +1059 -0
  175. sage/misc/repr.py +203 -0
  176. sage/misc/reset.cp312-win_amd64.pyd +0 -0
  177. sage/misc/reset.pyx +196 -0
  178. sage/misc/sage_ostools.cp312-win_amd64.pyd +0 -0
  179. sage/misc/sage_ostools.pyx +323 -0
  180. sage/misc/sage_timeit.py +276 -0
  181. sage/misc/sage_timeit_class.cp312-win_amd64.pyd +0 -0
  182. sage/misc/sage_timeit_class.pyx +120 -0
  183. sage/misc/sage_unittest.py +637 -0
  184. sage/misc/sageinspect.py +2768 -0
  185. sage/misc/session.cp312-win_amd64.pyd +0 -0
  186. sage/misc/session.pyx +392 -0
  187. sage/misc/superseded.py +557 -0
  188. sage/misc/test_nested_class.py +228 -0
  189. sage/misc/timing.py +264 -0
  190. sage/misc/unknown.py +222 -0
  191. sage/misc/verbose.py +253 -0
  192. sage/misc/weak_dict.cp312-win_amd64.pyd +0 -0
  193. sage/misc/weak_dict.pxd +15 -0
  194. sage/misc/weak_dict.pyx +1231 -0
  195. sage/modules/all__sagemath_objects.py +1 -0
  196. sage/modules/module.cp312-win_amd64.pyd +0 -0
  197. sage/modules/module.pxd +5 -0
  198. sage/modules/module.pyx +329 -0
  199. sage/rings/all__sagemath_objects.py +3 -0
  200. sage/rings/integer_fake.h +22 -0
  201. sage/rings/integer_fake.pxd +55 -0
  202. sage/sets/all__sagemath_objects.py +3 -0
  203. sage/sets/pythonclass.cp312-win_amd64.pyd +0 -0
  204. sage/sets/pythonclass.pxd +9 -0
  205. sage/sets/pythonclass.pyx +247 -0
  206. sage/structure/__init__.py +13 -0
  207. sage/structure/all.py +30 -0
  208. sage/structure/category_object.cp312-win_amd64.pyd +0 -0
  209. sage/structure/category_object.pxd +28 -0
  210. sage/structure/category_object.pyx +1087 -0
  211. sage/structure/coerce.cp312-win_amd64.pyd +0 -0
  212. sage/structure/coerce.pxd +44 -0
  213. sage/structure/coerce.pyx +2107 -0
  214. sage/structure/coerce_actions.cp312-win_amd64.pyd +0 -0
  215. sage/structure/coerce_actions.pxd +27 -0
  216. sage/structure/coerce_actions.pyx +988 -0
  217. sage/structure/coerce_dict.cp312-win_amd64.pyd +0 -0
  218. sage/structure/coerce_dict.pxd +51 -0
  219. sage/structure/coerce_dict.pyx +1557 -0
  220. sage/structure/coerce_exceptions.py +23 -0
  221. sage/structure/coerce_maps.cp312-win_amd64.pyd +0 -0
  222. sage/structure/coerce_maps.pxd +28 -0
  223. sage/structure/coerce_maps.pyx +718 -0
  224. sage/structure/debug_options.cp312-win_amd64.pyd +0 -0
  225. sage/structure/debug_options.pxd +6 -0
  226. sage/structure/debug_options.pyx +54 -0
  227. sage/structure/dynamic_class.py +541 -0
  228. sage/structure/element.cp312-win_amd64.pyd +0 -0
  229. sage/structure/element.pxd +272 -0
  230. sage/structure/element.pyx +4772 -0
  231. sage/structure/element_wrapper.cp312-win_amd64.pyd +0 -0
  232. sage/structure/element_wrapper.pxd +12 -0
  233. sage/structure/element_wrapper.pyx +582 -0
  234. sage/structure/factorization.py +1422 -0
  235. sage/structure/factorization_integer.py +105 -0
  236. sage/structure/factory.cp312-win_amd64.pyd +0 -0
  237. sage/structure/factory.pyx +786 -0
  238. sage/structure/formal_sum.py +489 -0
  239. sage/structure/gens_py.py +73 -0
  240. sage/structure/global_options.py +1743 -0
  241. sage/structure/indexed_generators.py +863 -0
  242. sage/structure/list_clone.cp312-win_amd64.pyd +0 -0
  243. sage/structure/list_clone.pxd +65 -0
  244. sage/structure/list_clone.pyx +1867 -0
  245. sage/structure/list_clone_demo.cp312-win_amd64.pyd +0 -0
  246. sage/structure/list_clone_demo.pyx +248 -0
  247. sage/structure/list_clone_timings.py +179 -0
  248. sage/structure/list_clone_timings_cy.cp312-win_amd64.pyd +0 -0
  249. sage/structure/list_clone_timings_cy.pyx +86 -0
  250. sage/structure/mutability.cp312-win_amd64.pyd +0 -0
  251. sage/structure/mutability.pxd +21 -0
  252. sage/structure/mutability.pyx +348 -0
  253. sage/structure/nonexact.py +69 -0
  254. sage/structure/parent.cp312-win_amd64.pyd +0 -0
  255. sage/structure/parent.pxd +112 -0
  256. sage/structure/parent.pyx +3093 -0
  257. sage/structure/parent_base.cp312-win_amd64.pyd +0 -0
  258. sage/structure/parent_base.pxd +13 -0
  259. sage/structure/parent_base.pyx +44 -0
  260. sage/structure/parent_gens.cp312-win_amd64.pyd +0 -0
  261. sage/structure/parent_gens.pxd +22 -0
  262. sage/structure/parent_gens.pyx +377 -0
  263. sage/structure/parent_old.cp312-win_amd64.pyd +0 -0
  264. sage/structure/parent_old.pxd +25 -0
  265. sage/structure/parent_old.pyx +294 -0
  266. sage/structure/proof/__init__.py +1 -0
  267. sage/structure/proof/all.py +243 -0
  268. sage/structure/proof/proof.py +300 -0
  269. sage/structure/richcmp.cp312-win_amd64.pyd +0 -0
  270. sage/structure/richcmp.pxd +213 -0
  271. sage/structure/richcmp.pyx +495 -0
  272. sage/structure/sage_object.cp312-win_amd64.pyd +0 -0
  273. sage/structure/sage_object.pxd +3 -0
  274. sage/structure/sage_object.pyx +988 -0
  275. sage/structure/sage_object_test.py +19 -0
  276. sage/structure/sequence.py +937 -0
  277. sage/structure/set_factories.py +1178 -0
  278. sage/structure/set_factories_example.py +527 -0
  279. sage/structure/support_view.py +179 -0
  280. sage/structure/test_factory.py +56 -0
  281. sage/structure/unique_representation.py +1359 -0
@@ -0,0 +1,7 @@
1
+ # sage_setup: distribution = sagemath-objects
2
+ cdef class _LazyString():
3
+ cdef func
4
+ cdef args
5
+ cdef kwargs
6
+ cdef val(self)
7
+ cpdef update_lazy_string(self, args, kwds)
@@ -0,0 +1,546 @@
1
+ # sage_setup: distribution = sagemath-objects
2
+ """
3
+ Lazy strings
4
+
5
+ Based on speaklater: https://github.com/mitsuhiko/speaklater.
6
+
7
+ A lazy string is an object that behaves almost exactly like a string
8
+ but where the value is not computed until needed. To define a lazy
9
+ string you specify a function that produces a string together with the
10
+ appropriate arguments for that function.
11
+
12
+ EXAMPLES::
13
+
14
+ sage: from sage.misc.lazy_string import lazy_string
15
+ sage: L = []
16
+ sage: s = lazy_string(lambda x: str(len(x)), L)
17
+ sage: L.append(5)
18
+ sage: s
19
+ l'1'
20
+
21
+ Note that the function is recomputed each time::
22
+
23
+ sage: L.append(6)
24
+ sage: s
25
+ l'2'
26
+ """
27
+
28
+ # Copyright (c) 2009 by Armin Ronacher.
29
+ #
30
+ # Some rights reserved.
31
+ #
32
+ # Redistribution and use in source and binary forms, with or without
33
+ # modification, are permitted provided that the following conditions are
34
+ # met:
35
+ #
36
+ # * Redistributions of source code must retain the above copyright
37
+ # notice, this list of conditions and the following disclaimer.
38
+ #
39
+ # * Redistributions in binary form must reproduce the above
40
+ # copyright notice, this list of conditions and the following
41
+ # disclaimer in the documentation and/or other materials provided
42
+ # with the distribution.
43
+ #
44
+ # * The names of the contributors may not be used to endorse or
45
+ # promote products derived from this software without specific
46
+ # prior written permission.
47
+ #
48
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
49
+ # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
50
+ # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
51
+ # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
52
+ # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
53
+ # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
54
+ # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
55
+ # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
56
+ # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
57
+ # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
58
+ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
59
+
60
+ from cpython.object cimport PyObject_Call, PyObject_RichCompare
61
+
62
+ import types
63
+
64
+
65
+ def is_lazy_string(obj):
66
+ """
67
+ Check if the given object is a lazy string.
68
+
69
+ EXAMPLES::
70
+
71
+ sage: from sage.misc.lazy_string import lazy_string, is_lazy_string
72
+ sage: f = lambda: "laziness"
73
+ sage: s = lazy_string(f)
74
+ sage: is_lazy_string(s)
75
+ True
76
+ """
77
+ return isinstance(obj, _LazyString)
78
+
79
+
80
+ def lazy_string(f, *args, **kwargs):
81
+ """
82
+ Create a lazy string.
83
+
84
+ INPUT:
85
+
86
+ - ``f`` -- either a callable or a (format) string
87
+ - positional arguments that are given to ``f``, either by calling or by
88
+ applying it as a format string
89
+ - named arguments that are forwarded to ``f`` if it is not a string
90
+
91
+ EXAMPLES::
92
+
93
+ sage: from sage.misc.lazy_string import lazy_string
94
+ sage: f = lambda x: "laziness in "+str(x)
95
+ sage: s = lazy_string(f, ZZ); s
96
+ l'laziness in Integer Ring'
97
+
98
+ Here, we demonstrate that the evaluation is postponed until the value is
99
+ needed, and that the result is not cached::
100
+
101
+ sage: class C:
102
+ ....: def __repr__(self):
103
+ ....: print("determining string representation")
104
+ ....: return "a test"
105
+ sage: c = C()
106
+ sage: s = lazy_string("this is %s", c)
107
+ sage: s
108
+ determining string representation
109
+ l'this is a test'
110
+ sage: s == 'this is a test'
111
+ determining string representation
112
+ True
113
+ """
114
+ return _LazyString(f, args, kwargs)
115
+
116
+
117
+ def _make_lazy_string(ftype, fpickle, args, kwargs):
118
+ """
119
+ Used for pickling.
120
+
121
+ EXAMPLES::
122
+
123
+ sage: from sage.misc.lazy_string import _make_lazy_string
124
+ sage: s = _make_lazy_string(None, lambda: "laziness", (), {})
125
+ sage: s
126
+ l'laziness'
127
+ """
128
+ if ftype == 'func':
129
+ from sage.misc.fpickle import unpickle_function
130
+ f = unpickle_function(fpickle)
131
+ else:
132
+ f = fpickle
133
+ return _LazyString(f, args, kwargs)
134
+
135
+
136
+ cdef class _LazyString():
137
+ """
138
+ Lazy class for strings created by a function call or a format string.
139
+
140
+ INPUT:
141
+
142
+ - ``f`` -- either a callable or a (format) string
143
+ - ``args`` -- tuple of arguments that are given to ``f``, either by calling
144
+ or by applying it as a format string
145
+ - ``kwargs`` -- dictionary of optional arguments, that are forwarded to ``f``
146
+ if it is a callable
147
+
148
+ .. NOTE::
149
+
150
+ Evaluation of ``f`` is postponed until it becomes necessary, e.g., for
151
+ comparison. The result of evaluation is not cached. The proxy
152
+ implementation attempts to be as complete as possible, so that the
153
+ lazy objects should mostly work as expected, for example for sorting.
154
+
155
+ The function :func:`lazy_string` creates lazy strings in a slightly more
156
+ convenient way, because it is then not needed to provide the arguments as
157
+ tuple and dictionary.
158
+
159
+ EXAMPLES::
160
+
161
+ sage: from sage.misc.lazy_string import lazy_string, _LazyString
162
+ sage: f = lambda x: "laziness in the " + repr(x)
163
+ sage: s = lazy_string(f, ZZ); s
164
+ l'laziness in the Integer Ring'
165
+ sage: lazy_string("laziness in the %s", ZZ)
166
+ l'laziness in the Integer Ring'
167
+
168
+ Here, we demonstrate that the evaluation is postponed until the value is
169
+ needed, and that the result is not cached. Also, we create a lazy string directly,
170
+ without calling :func:`lazy_string`::
171
+
172
+ sage: class C:
173
+ ....: def __repr__(self):
174
+ ....: print("determining string representation")
175
+ ....: return "a test"
176
+ sage: c = C()
177
+ sage: s = _LazyString("this is %s", (c,), {})
178
+ sage: s
179
+ determining string representation
180
+ l'this is a test'
181
+ sage: s == 'this is a test'
182
+ determining string representation
183
+ True
184
+ """
185
+ def __init__(self, f, args, kwargs):
186
+ """
187
+ INPUT:
188
+
189
+ - ``f`` -- either a callable or a (format) string
190
+ - ``args`` -- tuple of arguments that are given to ``f``, either by calling
191
+ or by applying it as a format string
192
+ - ``kwargs`` -- dictionary of optional arguments, that are forwarded to ``f``
193
+ if it is a callable
194
+
195
+ EXAMPLES::
196
+
197
+ sage: from sage.misc.lazy_string import lazy_string
198
+ sage: f = lambda x: "laziness" + repr(x)
199
+ sage: s = lazy_string(f, 5); s
200
+ l'laziness5'
201
+ sage: lazy_string("This is %s", ZZ)
202
+ l'This is Integer Ring'
203
+ """
204
+ self.func = f
205
+ self.args = <tuple?>args
206
+ self.kwargs = <dict?>kwargs
207
+
208
+ cdef val(self):
209
+ cdef f = self.func
210
+ if isinstance(f, str):
211
+ return f % self.args
212
+ return PyObject_Call(f, self.args, self.kwargs)
213
+
214
+ @property
215
+ def value(self):
216
+ """
217
+ Return the value of this lazy string, as an ordinary string.
218
+
219
+ EXAMPLES::
220
+
221
+ sage: from sage.misc.lazy_string import lazy_string
222
+ sage: f = lambda: "laziness"
223
+ sage: lazy_string(f).value
224
+ 'laziness'
225
+
226
+ ::
227
+
228
+ sage: from sage.misc.lazy_string import lazy_string
229
+ sage: lazy_string("%s", "laziness").value
230
+ 'laziness'
231
+ """
232
+ return self.val()
233
+
234
+ def __contains__(self, key):
235
+ """
236
+ EXAMPLES::
237
+
238
+ sage: from sage.misc.lazy_string import lazy_string
239
+ sage: f = lambda: "laziness"
240
+ sage: s = lazy_string(f)
241
+ sage: 'zi' in s
242
+ True
243
+ sage: 'ni' in s
244
+ False
245
+ """
246
+ return key in self.val()
247
+
248
+ def __bool__(self):
249
+ """
250
+ EXAMPLES::
251
+
252
+ sage: from sage.misc.lazy_string import lazy_string
253
+ sage: f = lambda: "laziness"
254
+ sage: bool(lazy_string(f))
255
+ True
256
+ sage: f = lambda: ""
257
+ sage: bool(lazy_string(f))
258
+ False
259
+ """
260
+ return bool(self.val())
261
+
262
+ def __dir__(self):
263
+ """
264
+ We assume that the underlying value provides the methods of a
265
+ unicode string.
266
+
267
+ EXAMPLES::
268
+
269
+ sage: from sage.misc.lazy_string import lazy_string
270
+ sage: f = lambda: "laziness"
271
+ sage: s = lazy_string(f)
272
+ sage: "split" in dir(s) # indirect doctest
273
+ True
274
+ """
275
+ return dir(unicode)
276
+
277
+ def __iter__(self):
278
+ """
279
+ EXAMPLES::
280
+
281
+ sage: from sage.misc.lazy_string import lazy_string
282
+ sage: f = lambda: "laziness"
283
+ sage: s = lazy_string(f)
284
+ sage: "".join(list(s)) # indirect doctest
285
+ 'laziness'
286
+ """
287
+ return iter(self.val())
288
+
289
+ def __len__(self):
290
+ """
291
+ EXAMPLES::
292
+
293
+ sage: from sage.misc.lazy_string import lazy_string
294
+ sage: f = lambda: "laziness"
295
+ sage: s = lazy_string(f)
296
+ sage: len(s)
297
+ 8
298
+ """
299
+ return len(self.val())
300
+
301
+ def __str__(self):
302
+ """
303
+ EXAMPLES::
304
+
305
+ sage: from sage.misc.lazy_string import lazy_string
306
+ sage: f = lambda: "laziness"
307
+ sage: s = lazy_string(f)
308
+ sage: str(s) # indirect doctest
309
+ 'laziness'
310
+ """
311
+ return str(self.val())
312
+
313
+ def __fspath__(self):
314
+ """
315
+ Return the file system representation of ``self``, assuming that
316
+ ``self`` is a path.
317
+
318
+ This is for Python 3 compatibility: see :issue:`24046`, and also
319
+ :pep:`519` and
320
+ https://docs.python.org/3/library/os.html#os.fspath
321
+
322
+ EXAMPLES::
323
+
324
+ sage: from sage.misc.lazy_string import lazy_string
325
+ sage: f = lambda: "/dev/null"
326
+ sage: s = lazy_string(f)
327
+ sage: os.fspath(s)
328
+ '/dev/null'
329
+ """
330
+ return str(self)
331
+
332
+ def __add__(self, other):
333
+ """
334
+ EXAMPLES::
335
+
336
+ sage: from sage.misc.lazy_string import lazy_string
337
+ sage: f = lambda: "laziness"
338
+ sage: s = lazy_string(f)
339
+ sage: s + " supreme"
340
+ 'laziness supreme'
341
+ """
342
+ if isinstance(self, _LazyString):
343
+ return (<_LazyString>self).val() + other
344
+ else:
345
+ return self + (<_LazyString>other).val()
346
+
347
+ def __mod__(self, other):
348
+ """
349
+ EXAMPLES::
350
+
351
+ sage: from sage.misc.lazy_string import lazy_string
352
+ sage: f = lambda: "laz%sss"
353
+ sage: s = lazy_string(f)
354
+ sage: s % "ine"
355
+ 'laziness'
356
+ sage: from sage.misc.lazy_string import lazy_string
357
+ sage: f = lambda: "ine"
358
+ sage: s = lazy_string(f)
359
+ sage: "laz%sss" % s
360
+ 'laziness'
361
+ """
362
+ if isinstance(self, _LazyString):
363
+ return (<_LazyString>self).val() % other
364
+ else:
365
+ return self % (<_LazyString>other).val()
366
+
367
+ def __mul__(self, other):
368
+ """
369
+ EXAMPLES::
370
+
371
+ sage: from sage.misc.lazy_string import lazy_string
372
+ sage: f = lambda: "laziness"
373
+ sage: s = lazy_string(f)
374
+ sage: s * 2
375
+ 'lazinesslaziness'
376
+ sage: 2 * s
377
+ 'lazinesslaziness'
378
+ """
379
+ if isinstance(self, _LazyString):
380
+ return (<_LazyString>self).val() * other
381
+ else:
382
+ return self * (<_LazyString>other).val()
383
+
384
+ def __richcmp__(_LazyString self, other, int op):
385
+ """
386
+ EXAMPLES::
387
+
388
+ sage: from sage.misc.lazy_string import lazy_string
389
+ sage: f = lambda: "laziness"
390
+ sage: s = lazy_string(f)
391
+ sage: s < 'laziness'
392
+ False
393
+ sage: s < 'azi'
394
+ False
395
+ sage: s < s
396
+ False
397
+ sage: s <= 'laziness'
398
+ True
399
+ sage: s <= 'azi'
400
+ False
401
+ sage: s <= s
402
+ True
403
+ sage: s == 'laziness'
404
+ True
405
+ sage: s == 'azi'
406
+ False
407
+ sage: s == s
408
+ True
409
+ sage: s != 'laziness'
410
+ False
411
+ sage: s != 'azi'
412
+ True
413
+ sage: s != s
414
+ False
415
+ sage: s > 'laziness'
416
+ False
417
+ sage: s > 'azi'
418
+ True
419
+ sage: s > s
420
+ False
421
+ sage: s >= 'laziness'
422
+ True
423
+ sage: s >= 'azi'
424
+ True
425
+ sage: s >= s
426
+ True
427
+ """
428
+ return PyObject_RichCompare(self.val(), other, op)
429
+
430
+ def __getattr__(self, name):
431
+ """
432
+ We pass attribute lookup through to the underlying value.
433
+
434
+ EXAMPLES::
435
+
436
+ sage: from sage.misc.lazy_string import lazy_string
437
+ sage: f = lambda: "laziness"
438
+ sage: s = lazy_string(f)
439
+ sage: s.endswith('ess')
440
+ True
441
+ sage: s.find('i')
442
+ 3
443
+ """
444
+ if name == '__members__':
445
+ return self.__dir__()
446
+ return getattr(self.val(), name)
447
+
448
+ def __reduce__(self):
449
+ """
450
+ Pickling.
451
+
452
+ EXAMPLES::
453
+
454
+ sage: from sage.misc.lazy_string import lazy_string
455
+ sage: f = lambda: "laziness"
456
+ sage: s = lazy_string(f)
457
+ sage: TestSuite(s).run() # indirect doctest
458
+ """
459
+ if isinstance(self.func, types.FunctionType):
460
+ from sage.misc.fpickle import pickle_function
461
+ f = pickle_function(self.func)
462
+ ftype = 'func'
463
+ else:
464
+ f = self.func
465
+ ftype = None
466
+ return _make_lazy_string, (ftype, f, self.args, self.kwargs)
467
+
468
+ def __getitem__(self, key):
469
+ """
470
+ EXAMPLES::
471
+
472
+ sage: from sage.misc.lazy_string import lazy_string
473
+ sage: f = lambda: "laziness"
474
+ sage: s = lazy_string(f)
475
+ sage: s[4]
476
+ 'n'
477
+ """
478
+ return self.val()[key]
479
+
480
+ def __copy__(self):
481
+ """
482
+ EXAMPLES::
483
+
484
+ sage: from sage.misc.lazy_string import lazy_string
485
+ sage: f = lambda: "laziness"
486
+ sage: s = lazy_string(f)
487
+ sage: copy(s) is s
488
+ True
489
+ """
490
+ return self
491
+
492
+ def __repr__(self):
493
+ """
494
+ EXAMPLES::
495
+
496
+ sage: from sage.misc.lazy_string import lazy_string
497
+ sage: f = lambda: "laziness"
498
+ sage: s = lazy_string(f)
499
+ sage: s # indirect doctest
500
+ l'laziness'
501
+ """
502
+ try:
503
+ return 'l' + repr(self.val())
504
+ except Exception:
505
+ return '<%s broken>' % self.__class__.__name__
506
+
507
+ cpdef update_lazy_string(self, args, kwds):
508
+ """
509
+ Change this lazy string in-place.
510
+
511
+ INPUT:
512
+
513
+ - ``args`` -- tuple
514
+ - ``kwds`` -- dictionary
515
+
516
+ .. NOTE::
517
+
518
+ Lazy strings are not hashable, and thus an in-place change is
519
+ allowed.
520
+
521
+ EXAMPLES::
522
+
523
+ sage: # needs sage.rings.finite_rings
524
+ sage: from sage.misc.lazy_string import lazy_string
525
+ sage: def f(op, A, B):
526
+ ....: return "unsupported operand parent(s) for %s: '%s' and '%s'" % (op, A, B)
527
+ sage: R = GF(5)
528
+ sage: S = GF(3)
529
+ sage: D = lazy_string(f, '+', R, S); D
530
+ l"unsupported operand parent(s) for +: 'Finite Field of size 5' and 'Finite Field of size 3'"
531
+ sage: D.update_lazy_string(('+', S, R), {})
532
+
533
+ Apparently, the lazy string got changed in-place::
534
+
535
+ sage: D # needs sage.rings.finite_rings
536
+ l"unsupported operand parent(s) for +: 'Finite Field of size 3' and 'Finite Field of size 5'"
537
+
538
+ TESTS::
539
+
540
+ sage: D.update_lazy_string(None, None) # needs sage.rings.finite_rings
541
+ Traceback (most recent call last):
542
+ ...
543
+ TypeError: Expected tuple, got NoneType
544
+ """
545
+ self.args = <tuple?>args
546
+ self.kwargs = <dict?>kwds