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.
- passagemath_objects/.dylibs/libgmp.10.dylib +0 -0
- passagemath_objects/__init__.py +3 -0
- passagemath_objects-10.6.46.dist-info/METADATA +115 -0
- passagemath_objects-10.6.46.dist-info/RECORD +280 -0
- passagemath_objects-10.6.46.dist-info/WHEEL +6 -0
- passagemath_objects-10.6.46.dist-info/top_level.txt +3 -0
- sage/all__sagemath_objects.py +37 -0
- sage/arith/all__sagemath_objects.py +5 -0
- sage/arith/long.pxd +411 -0
- sage/arith/numerical_approx.cpython-314t-darwin.so +0 -0
- sage/arith/numerical_approx.pxd +35 -0
- sage/arith/numerical_approx.pyx +75 -0
- sage/arith/power.cpython-314t-darwin.so +0 -0
- sage/arith/power.pxd +31 -0
- sage/arith/power.pyx +127 -0
- sage/categories/action.cpython-314t-darwin.so +0 -0
- sage/categories/action.pxd +29 -0
- sage/categories/action.pyx +641 -0
- sage/categories/algebra_functor.py +745 -0
- sage/categories/all__sagemath_objects.py +33 -0
- sage/categories/basic.py +62 -0
- sage/categories/cartesian_product.py +295 -0
- sage/categories/category.py +3401 -0
- sage/categories/category_cy_helper.cpython-314t-darwin.so +0 -0
- sage/categories/category_cy_helper.pxd +8 -0
- sage/categories/category_cy_helper.pyx +322 -0
- sage/categories/category_singleton.cpython-314t-darwin.so +0 -0
- sage/categories/category_singleton.pxd +3 -0
- sage/categories/category_singleton.pyx +342 -0
- sage/categories/category_types.py +637 -0
- sage/categories/category_with_axiom.py +2876 -0
- sage/categories/covariant_functorial_construction.py +703 -0
- sage/categories/facade_sets.py +228 -0
- sage/categories/functor.cpython-314t-darwin.so +0 -0
- sage/categories/functor.pxd +7 -0
- sage/categories/functor.pyx +691 -0
- sage/categories/homset.py +1338 -0
- sage/categories/homsets.py +364 -0
- sage/categories/isomorphic_objects.py +73 -0
- sage/categories/map.cpython-314t-darwin.so +0 -0
- sage/categories/map.pxd +34 -0
- sage/categories/map.pyx +2106 -0
- sage/categories/morphism.cpython-314t-darwin.so +0 -0
- sage/categories/morphism.pxd +14 -0
- sage/categories/morphism.pyx +895 -0
- sage/categories/objects.py +167 -0
- sage/categories/primer.py +1696 -0
- sage/categories/pushout.py +4834 -0
- sage/categories/quotients.py +64 -0
- sage/categories/realizations.py +200 -0
- sage/categories/sets_cat.py +3290 -0
- sage/categories/sets_with_partial_maps.py +52 -0
- sage/categories/subobjects.py +64 -0
- sage/categories/subquotients.py +21 -0
- sage/categories/with_realizations.py +311 -0
- sage/cpython/__init__.py +19 -0
- sage/cpython/_py2_random.py +619 -0
- sage/cpython/all.py +3 -0
- sage/cpython/atexit.cpython-314t-darwin.so +0 -0
- sage/cpython/atexit.pyx +269 -0
- sage/cpython/builtin_types.cpython-314t-darwin.so +0 -0
- sage/cpython/builtin_types.pyx +7 -0
- sage/cpython/cython_metaclass.cpython-314t-darwin.so +0 -0
- sage/cpython/cython_metaclass.h +117 -0
- sage/cpython/cython_metaclass.pxd +3 -0
- sage/cpython/cython_metaclass.pyx +130 -0
- sage/cpython/debug.cpython-314t-darwin.so +0 -0
- sage/cpython/debug.pyx +302 -0
- sage/cpython/dict_del_by_value.cpython-314t-darwin.so +0 -0
- sage/cpython/dict_del_by_value.pxd +9 -0
- sage/cpython/dict_del_by_value.pyx +191 -0
- sage/cpython/dict_internal.h +245 -0
- sage/cpython/getattr.cpython-314t-darwin.so +0 -0
- sage/cpython/getattr.pxd +9 -0
- sage/cpython/getattr.pyx +439 -0
- sage/cpython/pycore_long.h +97 -0
- sage/cpython/pycore_long.pxd +10 -0
- sage/cpython/python_debug.h +44 -0
- sage/cpython/python_debug.pxd +47 -0
- sage/cpython/pyx_visit.h +13 -0
- sage/cpython/string.cpython-314t-darwin.so +0 -0
- sage/cpython/string.pxd +76 -0
- sage/cpython/string.pyx +34 -0
- sage/cpython/string_impl.h +60 -0
- sage/cpython/type.cpython-314t-darwin.so +0 -0
- sage/cpython/type.pxd +2 -0
- sage/cpython/type.pyx +40 -0
- sage/cpython/wrapperdescr.pxd +67 -0
- sage/ext/all__sagemath_objects.py +3 -0
- sage/ext/ccobject.h +64 -0
- sage/ext/cplusplus.pxd +17 -0
- sage/ext/mod_int.h +30 -0
- sage/ext/mod_int.pxd +24 -0
- sage/ext/stdsage.pxd +39 -0
- sage/groups/all__sagemath_objects.py +1 -0
- sage/groups/group.cpython-314t-darwin.so +0 -0
- sage/groups/group.pxd +14 -0
- sage/groups/group.pyx +322 -0
- sage/groups/old.cpython-314t-darwin.so +0 -0
- sage/groups/old.pxd +14 -0
- sage/groups/old.pyx +219 -0
- sage/libs/all__sagemath_objects.py +3 -0
- sage/libs/gmp/__init__.py +1 -0
- sage/libs/gmp/all.pxd +6 -0
- sage/libs/gmp/binop.pxd +23 -0
- sage/libs/gmp/misc.pxd +8 -0
- sage/libs/gmp/mpf.pxd +88 -0
- sage/libs/gmp/mpn.pxd +57 -0
- sage/libs/gmp/mpq.pxd +57 -0
- sage/libs/gmp/mpz.pxd +202 -0
- sage/libs/gmp/pylong.cpython-314t-darwin.so +0 -0
- sage/libs/gmp/pylong.pxd +12 -0
- sage/libs/gmp/pylong.pyx +150 -0
- sage/libs/gmp/random.pxd +25 -0
- sage/libs/gmp/randomize.pxd +59 -0
- sage/libs/gmp/types.pxd +53 -0
- sage/libs/gmpxx.pxd +19 -0
- sage/misc/abstract_method.py +276 -0
- sage/misc/all__sagemath_objects.py +43 -0
- sage/misc/bindable_class.py +253 -0
- sage/misc/c3_controlled.cpython-314t-darwin.so +0 -0
- sage/misc/c3_controlled.pxd +2 -0
- sage/misc/c3_controlled.pyx +1402 -0
- sage/misc/cachefunc.cpython-314t-darwin.so +0 -0
- sage/misc/cachefunc.pxd +43 -0
- sage/misc/cachefunc.pyx +3781 -0
- sage/misc/call.py +188 -0
- sage/misc/classcall_metaclass.cpython-314t-darwin.so +0 -0
- sage/misc/classcall_metaclass.pxd +14 -0
- sage/misc/classcall_metaclass.pyx +599 -0
- sage/misc/constant_function.cpython-314t-darwin.so +0 -0
- sage/misc/constant_function.pyx +130 -0
- sage/misc/decorators.py +747 -0
- sage/misc/fast_methods.cpython-314t-darwin.so +0 -0
- sage/misc/fast_methods.pxd +20 -0
- sage/misc/fast_methods.pyx +351 -0
- sage/misc/flatten.py +90 -0
- sage/misc/fpickle.cpython-314t-darwin.so +0 -0
- sage/misc/fpickle.pyx +177 -0
- sage/misc/function_mangling.cpython-314t-darwin.so +0 -0
- sage/misc/function_mangling.pxd +11 -0
- sage/misc/function_mangling.pyx +308 -0
- sage/misc/inherit_comparison.cpython-314t-darwin.so +0 -0
- sage/misc/inherit_comparison.pxd +5 -0
- sage/misc/inherit_comparison.pyx +105 -0
- sage/misc/instancedoc.cpython-314t-darwin.so +0 -0
- sage/misc/instancedoc.pyx +331 -0
- sage/misc/lazy_attribute.cpython-314t-darwin.so +0 -0
- sage/misc/lazy_attribute.pyx +607 -0
- sage/misc/lazy_format.py +135 -0
- sage/misc/lazy_import.cpython-314t-darwin.so +0 -0
- sage/misc/lazy_import.pyx +1299 -0
- sage/misc/lazy_import_cache.py +36 -0
- sage/misc/lazy_list.cpython-314t-darwin.so +0 -0
- sage/misc/lazy_list.pxd +19 -0
- sage/misc/lazy_list.pyx +1187 -0
- sage/misc/lazy_string.cpython-314t-darwin.so +0 -0
- sage/misc/lazy_string.pxd +7 -0
- sage/misc/lazy_string.pyx +546 -0
- sage/misc/misc.py +1066 -0
- sage/misc/misc_c.cpython-314t-darwin.so +0 -0
- sage/misc/misc_c.pxd +3 -0
- sage/misc/misc_c.pyx +766 -0
- sage/misc/namespace_package.py +37 -0
- sage/misc/nested_class.cpython-314t-darwin.so +0 -0
- sage/misc/nested_class.pxd +3 -0
- sage/misc/nested_class.pyx +394 -0
- sage/misc/persist.cpython-314t-darwin.so +0 -0
- sage/misc/persist.pyx +1251 -0
- sage/misc/prandom.py +418 -0
- sage/misc/randstate.cpython-314t-darwin.so +0 -0
- sage/misc/randstate.pxd +30 -0
- sage/misc/randstate.pyx +1059 -0
- sage/misc/repr.py +203 -0
- sage/misc/reset.cpython-314t-darwin.so +0 -0
- sage/misc/reset.pyx +196 -0
- sage/misc/sage_ostools.cpython-314t-darwin.so +0 -0
- sage/misc/sage_ostools.pyx +323 -0
- sage/misc/sage_timeit.py +275 -0
- sage/misc/sage_timeit_class.cpython-314t-darwin.so +0 -0
- sage/misc/sage_timeit_class.pyx +120 -0
- sage/misc/sage_unittest.py +637 -0
- sage/misc/sageinspect.py +2768 -0
- sage/misc/session.cpython-314t-darwin.so +0 -0
- sage/misc/session.pyx +392 -0
- sage/misc/superseded.py +557 -0
- sage/misc/test_nested_class.py +228 -0
- sage/misc/timing.py +264 -0
- sage/misc/unknown.py +222 -0
- sage/misc/verbose.py +253 -0
- sage/misc/weak_dict.cpython-314t-darwin.so +0 -0
- sage/misc/weak_dict.pxd +15 -0
- sage/misc/weak_dict.pyx +1231 -0
- sage/modules/all__sagemath_objects.py +1 -0
- sage/modules/module.cpython-314t-darwin.so +0 -0
- sage/modules/module.pxd +5 -0
- sage/modules/module.pyx +329 -0
- sage/rings/all__sagemath_objects.py +3 -0
- sage/rings/integer_fake.h +22 -0
- sage/rings/integer_fake.pxd +55 -0
- sage/sets/all__sagemath_objects.py +3 -0
- sage/sets/pythonclass.cpython-314t-darwin.so +0 -0
- sage/sets/pythonclass.pxd +9 -0
- sage/sets/pythonclass.pyx +247 -0
- sage/structure/__init__.py +4 -0
- sage/structure/all.py +30 -0
- sage/structure/category_object.cpython-314t-darwin.so +0 -0
- sage/structure/category_object.pxd +28 -0
- sage/structure/category_object.pyx +1087 -0
- sage/structure/coerce.cpython-314t-darwin.so +0 -0
- sage/structure/coerce.pxd +44 -0
- sage/structure/coerce.pyx +2107 -0
- sage/structure/coerce_actions.cpython-314t-darwin.so +0 -0
- sage/structure/coerce_actions.pxd +27 -0
- sage/structure/coerce_actions.pyx +988 -0
- sage/structure/coerce_dict.cpython-314t-darwin.so +0 -0
- sage/structure/coerce_dict.pxd +51 -0
- sage/structure/coerce_dict.pyx +1557 -0
- sage/structure/coerce_exceptions.py +23 -0
- sage/structure/coerce_maps.cpython-314t-darwin.so +0 -0
- sage/structure/coerce_maps.pxd +28 -0
- sage/structure/coerce_maps.pyx +718 -0
- sage/structure/debug_options.cpython-314t-darwin.so +0 -0
- sage/structure/debug_options.pxd +6 -0
- sage/structure/debug_options.pyx +54 -0
- sage/structure/dynamic_class.py +541 -0
- sage/structure/element.cpython-314t-darwin.so +0 -0
- sage/structure/element.pxd +272 -0
- sage/structure/element.pyx +4772 -0
- sage/structure/element_wrapper.cpython-314t-darwin.so +0 -0
- sage/structure/element_wrapper.pxd +12 -0
- sage/structure/element_wrapper.pyx +582 -0
- sage/structure/factorization.py +1422 -0
- sage/structure/factorization_integer.py +105 -0
- sage/structure/factory.cpython-314t-darwin.so +0 -0
- sage/structure/factory.pyx +786 -0
- sage/structure/formal_sum.py +489 -0
- sage/structure/gens_py.py +73 -0
- sage/structure/global_options.py +1743 -0
- sage/structure/indexed_generators.py +863 -0
- sage/structure/list_clone.cpython-314t-darwin.so +0 -0
- sage/structure/list_clone.pxd +65 -0
- sage/structure/list_clone.pyx +1867 -0
- sage/structure/list_clone_demo.cpython-314t-darwin.so +0 -0
- sage/structure/list_clone_demo.pyx +248 -0
- sage/structure/list_clone_timings.py +179 -0
- sage/structure/list_clone_timings_cy.cpython-314t-darwin.so +0 -0
- sage/structure/list_clone_timings_cy.pyx +86 -0
- sage/structure/mutability.cpython-314t-darwin.so +0 -0
- sage/structure/mutability.pxd +21 -0
- sage/structure/mutability.pyx +348 -0
- sage/structure/nonexact.py +69 -0
- sage/structure/parent.cpython-314t-darwin.so +0 -0
- sage/structure/parent.pxd +112 -0
- sage/structure/parent.pyx +3093 -0
- sage/structure/parent_base.cpython-314t-darwin.so +0 -0
- sage/structure/parent_base.pxd +13 -0
- sage/structure/parent_base.pyx +44 -0
- sage/structure/parent_gens.cpython-314t-darwin.so +0 -0
- sage/structure/parent_gens.pxd +22 -0
- sage/structure/parent_gens.pyx +377 -0
- sage/structure/parent_old.cpython-314t-darwin.so +0 -0
- sage/structure/parent_old.pxd +25 -0
- sage/structure/parent_old.pyx +294 -0
- sage/structure/proof/__init__.py +1 -0
- sage/structure/proof/all.py +243 -0
- sage/structure/proof/proof.py +300 -0
- sage/structure/richcmp.cpython-314t-darwin.so +0 -0
- sage/structure/richcmp.pxd +213 -0
- sage/structure/richcmp.pyx +495 -0
- sage/structure/sage_object.cpython-314t-darwin.so +0 -0
- sage/structure/sage_object.pxd +3 -0
- sage/structure/sage_object.pyx +988 -0
- sage/structure/sage_object_test.py +19 -0
- sage/structure/sequence.py +937 -0
- sage/structure/set_factories.py +1178 -0
- sage/structure/set_factories_example.py +527 -0
- sage/structure/support_view.py +179 -0
- sage/structure/test_factory.py +56 -0
- sage/structure/unique_representation.py +1359 -0
|
Binary file
|
|
@@ -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
|