passagemath-objects 10.6.44__cp314-cp314t-macosx_13_0_arm64.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.
- passagemath_objects/.dylibs/libgmp.10.dylib +0 -0
- passagemath_objects/__init__.py +3 -0
- passagemath_objects-10.6.44.dist-info/METADATA +115 -0
- passagemath_objects-10.6.44.dist-info/RECORD +280 -0
- passagemath_objects-10.6.44.dist-info/WHEEL +6 -0
- passagemath_objects-10.6.44.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
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-objects
|
|
2
|
+
# Copyright (c) 2009, Tom Boothby <boothby@math.washington.edu>
|
|
3
|
+
# All rights reserved.
|
|
4
|
+
#
|
|
5
|
+
# Redistribution and use in source and binary forms, with or without
|
|
6
|
+
# modification, are permitted provided that the following conditions are met:
|
|
7
|
+
# * Redistributions of source code must retain the above copyright
|
|
8
|
+
# notice, this list of conditions and the following disclaimer.
|
|
9
|
+
# * Redistributions in binary form must reproduce the above copyright
|
|
10
|
+
# notice, this list of conditions and the following disclaimer in the
|
|
11
|
+
# documentation and/or other materials provided with the distribution.
|
|
12
|
+
# * Neither the name of Sage nor the
|
|
13
|
+
# names of its contributors may be used to endorse or promote products
|
|
14
|
+
# derived from this software without specific prior written permission.
|
|
15
|
+
#
|
|
16
|
+
# THIS SOFTWARE IS PROVIDED BY Tom Boothby ''AS IS'' AND ANY
|
|
17
|
+
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
18
|
+
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
19
|
+
# DISCLAIMED. IN NO EVENT SHALL Tom Boothby BE LIABLE FOR ANY
|
|
20
|
+
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
21
|
+
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
22
|
+
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
|
23
|
+
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
24
|
+
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
25
|
+
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
Function Mangling
|
|
29
|
+
|
|
30
|
+
This module provides utilities for extracting information about python
|
|
31
|
+
functions.
|
|
32
|
+
|
|
33
|
+
AUTHORS:
|
|
34
|
+
|
|
35
|
+
- Tom Boothby (2009): Original version in Python
|
|
36
|
+
- Simon King (2011): Use Cython. Speedup of ``fix_to_pos``, cleaning documentation.
|
|
37
|
+
"""
|
|
38
|
+
|
|
39
|
+
from sage.misc.sageinspect import sage_getargspec
|
|
40
|
+
|
|
41
|
+
cdef class ArgumentFixer:
|
|
42
|
+
"""
|
|
43
|
+
This class provides functionality to normalize the arguments
|
|
44
|
+
passed into a function. While the various ways of calling a
|
|
45
|
+
function are perfectly equivalent from the perspective of the
|
|
46
|
+
callee, they don't always look the same for an object
|
|
47
|
+
watching the caller. For example,
|
|
48
|
+
::
|
|
49
|
+
|
|
50
|
+
sage: def f(x=10):
|
|
51
|
+
....: return min(1,x)
|
|
52
|
+
|
|
53
|
+
the following calls are equivalent,
|
|
54
|
+
::
|
|
55
|
+
|
|
56
|
+
sage: f()
|
|
57
|
+
1
|
|
58
|
+
sage: f(10)
|
|
59
|
+
1
|
|
60
|
+
sage: f(x=10)
|
|
61
|
+
1
|
|
62
|
+
|
|
63
|
+
but from the perspective of a wrapper, they are different::
|
|
64
|
+
|
|
65
|
+
sage: def wrap(g):
|
|
66
|
+
....: def _g(*args, **kwargs):
|
|
67
|
+
....: print("{} {}".format(args, kwargs))
|
|
68
|
+
....: return g(*args, **kwargs)
|
|
69
|
+
....: return _g
|
|
70
|
+
sage: h = wrap(f)
|
|
71
|
+
sage: t = h()
|
|
72
|
+
() {}
|
|
73
|
+
sage: t = h(10)
|
|
74
|
+
(10,) {}
|
|
75
|
+
sage: t = h(x=10)
|
|
76
|
+
() {'x': 10}
|
|
77
|
+
|
|
78
|
+
For the purpose of cached functions, it is important not
|
|
79
|
+
to distinguish between these uses.
|
|
80
|
+
|
|
81
|
+
INPUT:
|
|
82
|
+
|
|
83
|
+
- ``f`` -- a function
|
|
84
|
+
- ``classmethod`` -- boolean (default: ``False``); ``True`` if the function
|
|
85
|
+
is a classmethod and therefore the first argument is expected to be the
|
|
86
|
+
class instance. In that case, we ignore the first argument.
|
|
87
|
+
|
|
88
|
+
EXAMPLES::
|
|
89
|
+
|
|
90
|
+
sage: from sage.misc.function_mangling import ArgumentFixer
|
|
91
|
+
sage: def wrap2(g):
|
|
92
|
+
....: af = ArgumentFixer(g)
|
|
93
|
+
....: def _g(*args, **kwargs):
|
|
94
|
+
....: print(af.fix_to_pos())
|
|
95
|
+
....: return g(*args, **kwargs)
|
|
96
|
+
....: return _g
|
|
97
|
+
sage: h2 = wrap2(f)
|
|
98
|
+
sage: t = h2()
|
|
99
|
+
((10,), ())
|
|
100
|
+
sage: t = h2(10)
|
|
101
|
+
((10,), ())
|
|
102
|
+
sage: t = h2(x=10)
|
|
103
|
+
((10,), ())
|
|
104
|
+
|
|
105
|
+
::
|
|
106
|
+
|
|
107
|
+
sage: class one:
|
|
108
|
+
....: def __init__(self, x=1):
|
|
109
|
+
....: self.x = x
|
|
110
|
+
sage: af = ArgumentFixer(one.__init__, classmethod=True)
|
|
111
|
+
sage: af.fix_to_pos(1,2,3,a=31,b=2,n=3)
|
|
112
|
+
((1, 2, 3), (('a', 31), ('b', 2), ('n', 3)))
|
|
113
|
+
"""
|
|
114
|
+
def __init__(self, f, classmethod=False):
|
|
115
|
+
try:
|
|
116
|
+
arg_names, varargs, varkw, defaults, kwonlyargs, kwonlydefaults, annotations = sage_getargspec(f)
|
|
117
|
+
except AttributeError:
|
|
118
|
+
# This error occurs if f is defined in a Cython file and the
|
|
119
|
+
# source file has gone.
|
|
120
|
+
if classmethod:
|
|
121
|
+
arg_names = ['self']
|
|
122
|
+
varargs = 'args'
|
|
123
|
+
varkws = 'kwds'
|
|
124
|
+
defaults = None
|
|
125
|
+
else:
|
|
126
|
+
arg_names = []
|
|
127
|
+
varargs = 'args'
|
|
128
|
+
varkws = 'kwds'
|
|
129
|
+
defaults = None
|
|
130
|
+
if defaults is None:
|
|
131
|
+
self._default_tuple = defaults = ()
|
|
132
|
+
else:
|
|
133
|
+
self._default_tuple = tuple(defaults)
|
|
134
|
+
|
|
135
|
+
# code = f.__code__
|
|
136
|
+
|
|
137
|
+
self.f = f
|
|
138
|
+
self._ndefault = len(defaults)
|
|
139
|
+
if classmethod:
|
|
140
|
+
self._nargs = len(arg_names)-1 # code.co_argcount-1
|
|
141
|
+
self._arg_names = tuple(arg_names[1:]) # code.co_varnames[1:self._nargs+1]
|
|
142
|
+
else:
|
|
143
|
+
self._nargs = len(arg_names) # code.co_argcount
|
|
144
|
+
self._arg_names = tuple(arg_names) # code.co_varnames[:self._nargs]
|
|
145
|
+
self._classmethod = classmethod
|
|
146
|
+
|
|
147
|
+
cdef dict default_map
|
|
148
|
+
self._defaults = default_map = {}
|
|
149
|
+
for k, v in zip(self._arg_names[-self._ndefault:], defaults):
|
|
150
|
+
default_map[k] = v
|
|
151
|
+
|
|
152
|
+
def __repr__(self):
|
|
153
|
+
"""
|
|
154
|
+
EXAMPLES::
|
|
155
|
+
|
|
156
|
+
sage: from sage.misc.function_mangling import ArgumentFixer
|
|
157
|
+
sage: g = ArgumentFixer(number_of_partitions); g
|
|
158
|
+
Argument Fixer of <function number_of_partitions at 0x...>
|
|
159
|
+
"""
|
|
160
|
+
return "Argument Fixer of %s" % self.f
|
|
161
|
+
|
|
162
|
+
def fix_to_named(self, *args, **kwargs):
|
|
163
|
+
"""
|
|
164
|
+
Normalize the arguments with a preference for named arguments.
|
|
165
|
+
|
|
166
|
+
INPUT:
|
|
167
|
+
|
|
168
|
+
- any positional and named arguments.
|
|
169
|
+
|
|
170
|
+
OUTPUT: we return a tuple
|
|
171
|
+
|
|
172
|
+
`(e_1, e_2, ..., e_k), ((n_1, v_1), ... , (n_m, v_m))`
|
|
173
|
+
|
|
174
|
+
where `n_1, ... , n_m` are the names of the arguments and
|
|
175
|
+
`v_1, ..., v_m` are the values passed in; and `e_1, ..., e_k` are
|
|
176
|
+
the unnamed arguments. We minimize `k`.
|
|
177
|
+
|
|
178
|
+
The defaults are extracted from the function and filled
|
|
179
|
+
into the list ``K`` of named arguments. The names `n_1, ..., n_t`
|
|
180
|
+
are in order of the function definition, where `t` is the number
|
|
181
|
+
of named arguments. The remaining names, `n_{t+1}, ..., n_m` are
|
|
182
|
+
given in alphabetical order. This is useful to extract
|
|
183
|
+
the names of arguments, but **does not** maintain
|
|
184
|
+
equivalence of
|
|
185
|
+
::
|
|
186
|
+
|
|
187
|
+
A,K = self.fix_to_pos(...)
|
|
188
|
+
self.f(*A, **dict(K))`
|
|
189
|
+
|
|
190
|
+
and
|
|
191
|
+
::
|
|
192
|
+
|
|
193
|
+
self.f(...)
|
|
194
|
+
|
|
195
|
+
in all cases.
|
|
196
|
+
|
|
197
|
+
EXAMPLES::
|
|
198
|
+
|
|
199
|
+
sage: from sage.misc.function_mangling import ArgumentFixer
|
|
200
|
+
sage: def sum3(a, b, c=3, *args, **kwargs):
|
|
201
|
+
....: return a + b + c
|
|
202
|
+
sage: AF = ArgumentFixer(sum3)
|
|
203
|
+
sage: AF.fix_to_named(1, 2, 3, 4, 5, 6, f=14, e=16)
|
|
204
|
+
((4, 5, 6), (('a', 1), ('b', 2), ('c', 3), ('e', 16), ('f', 14)))
|
|
205
|
+
sage: AF.fix_to_named(1,2,f=14)
|
|
206
|
+
((), (('a', 1), ('b', 2), ('c', 3), ('f', 14)))
|
|
207
|
+
"""
|
|
208
|
+
cdef list ARGS = []
|
|
209
|
+
cdef tuple arg_names = self._arg_names
|
|
210
|
+
cdef int lenargs = len(args)
|
|
211
|
+
cdef dict defaults = self._defaults
|
|
212
|
+
cdef int i
|
|
213
|
+
cdef dict kwargs_ = dict(kwargs)
|
|
214
|
+
for i from 0<=i<self._nargs:
|
|
215
|
+
name = arg_names[i]
|
|
216
|
+
if i >= lenargs:
|
|
217
|
+
if name in kwargs_:
|
|
218
|
+
val = kwargs_[name]
|
|
219
|
+
del kwargs_[name]
|
|
220
|
+
else:
|
|
221
|
+
val = defaults[name]
|
|
222
|
+
else:
|
|
223
|
+
val = args[i]
|
|
224
|
+
ARGS.append((name, val))
|
|
225
|
+
extra_args = args[self._nargs:]
|
|
226
|
+
for k in sorted(kwargs_.keys()):
|
|
227
|
+
ARGS.append((k, kwargs_[k]))
|
|
228
|
+
return tuple(extra_args), tuple(ARGS)
|
|
229
|
+
|
|
230
|
+
def fix_to_pos(self, *args, **kwds):
|
|
231
|
+
"""
|
|
232
|
+
Normalize the arguments with a preference for positional arguments.
|
|
233
|
+
|
|
234
|
+
INPUT:
|
|
235
|
+
|
|
236
|
+
- ``*args``, ``**kwds`` -- any positional or named arguments
|
|
237
|
+
|
|
238
|
+
OUTPUT: we return a tuple
|
|
239
|
+
|
|
240
|
+
`(e_1, e_2, ..., e_k), ((n_1, v_1), ... , (n_m, v_m))`
|
|
241
|
+
|
|
242
|
+
where `n_1, ... , n_m` are the names of the arguments and
|
|
243
|
+
`v_1, ..., v_m` are the values passed in; and `e_1, ..., e_k`
|
|
244
|
+
are the unnamed arguments. We minimize `m`.
|
|
245
|
+
|
|
246
|
+
The commands
|
|
247
|
+
::
|
|
248
|
+
|
|
249
|
+
A,K = self.fix_to_pos(...)
|
|
250
|
+
self.f(*A, **dict(K))
|
|
251
|
+
|
|
252
|
+
are equivalent to
|
|
253
|
+
::
|
|
254
|
+
|
|
255
|
+
self.f(...)
|
|
256
|
+
|
|
257
|
+
though defaults are extracted from the function and
|
|
258
|
+
appended to the tuple ``A`` of positional arguments.
|
|
259
|
+
The names `n_1, ..., n_m` are given in alphabetical
|
|
260
|
+
order.
|
|
261
|
+
|
|
262
|
+
EXAMPLES::
|
|
263
|
+
|
|
264
|
+
sage: from sage.misc.function_mangling import ArgumentFixer
|
|
265
|
+
sage: def do_something(a, b, c=3, *args, **kwargs):
|
|
266
|
+
....: print("{} {} {} {} {}".format(a, b, c, args,
|
|
267
|
+
....: sorted(kwargs.items())))
|
|
268
|
+
sage: AF = ArgumentFixer(do_something)
|
|
269
|
+
sage: A, K = AF.fix_to_pos(1, 2, 3, 4, 5, 6, f=14, e=16)
|
|
270
|
+
sage: print("{} {}".format(A, K))
|
|
271
|
+
(1, 2, 3, 4, 5, 6) (('e', 16), ('f', 14))
|
|
272
|
+
sage: do_something(*A, **dict(K))
|
|
273
|
+
1 2 3 (4, 5, 6) [('e', 16), ('f', 14)]
|
|
274
|
+
sage: do_something(1, 2, 3, 4, 5, 6, f=14, e=16)
|
|
275
|
+
1 2 3 (4, 5, 6) [('e', 16), ('f', 14)]
|
|
276
|
+
"""
|
|
277
|
+
return self.fix_to_pos_args_kwds(args, kwds)
|
|
278
|
+
|
|
279
|
+
cdef fix_to_pos_args_kwds(self, tuple args, dict kwds):
|
|
280
|
+
"""
|
|
281
|
+
Fast Cython implementation of :meth:`fix_to_pos`.
|
|
282
|
+
"""
|
|
283
|
+
cdef Py_ssize_t lenargs = len(args)
|
|
284
|
+
cdef Py_ssize_t nargs = self._nargs
|
|
285
|
+
cdef tuple arg_names = self._arg_names
|
|
286
|
+
cdef dict defaults = self._defaults
|
|
287
|
+
# a shortpath for the case of no named arguments:
|
|
288
|
+
if not kwds:
|
|
289
|
+
if lenargs >= nargs:
|
|
290
|
+
return args, ()
|
|
291
|
+
# we take the given arguments, plus the default arguments
|
|
292
|
+
return args + self._default_tuple[-nargs+lenargs:], ()
|
|
293
|
+
cdef list Largs = list(args)
|
|
294
|
+
cdef dict kwargs = dict(kwds)
|
|
295
|
+
cdef Py_ssize_t i
|
|
296
|
+
for i in range(lenargs, nargs):
|
|
297
|
+
# in addition to the positional arguments, we take the
|
|
298
|
+
# ones with default values, unless they are overridden by
|
|
299
|
+
# the named arguments.
|
|
300
|
+
name = arg_names[i]
|
|
301
|
+
if name in kwargs:
|
|
302
|
+
val = kwargs[name]
|
|
303
|
+
del kwargs[name]
|
|
304
|
+
else:
|
|
305
|
+
val = defaults[name]
|
|
306
|
+
Largs.append(val)
|
|
307
|
+
cdef list Items = sorted(kwargs.items())
|
|
308
|
+
return tuple(Largs), tuple(Items)
|
|
Binary file
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-objects
|
|
2
|
+
"""
|
|
3
|
+
Metaclass for inheriting comparison functions
|
|
4
|
+
|
|
5
|
+
This module defines a metaclass :class:`InheritComparisonMetaclass` to
|
|
6
|
+
inherit comparison functions in Cython extension types. In Python 2,
|
|
7
|
+
the special methods ``__richcmp__``, ``__cmp__`` and ``__hash__`` are
|
|
8
|
+
only inherited as a whole: defining just 1 or 2 of these will prevent
|
|
9
|
+
the others from being inherited.
|
|
10
|
+
|
|
11
|
+
To solve this issue, you can use :class:`InheritComparisonMetaclass`
|
|
12
|
+
as a Cython "metaclass" (see :mod:`sage.cpython.cython_metaclass` for the
|
|
13
|
+
general mechanism). If you do this for an extension type which defines
|
|
14
|
+
neither ``__richcmp__`` nor ``__cmp__``, then both these methods are
|
|
15
|
+
inherited from the base class (the MRO is not used).
|
|
16
|
+
|
|
17
|
+
In Sage, this is in particular used for
|
|
18
|
+
:class:`sage.structure.element.Element` to support comparisons using
|
|
19
|
+
the coercion framework.
|
|
20
|
+
|
|
21
|
+
None of this is relevant to Python classes, which inherit comparison
|
|
22
|
+
methods anyway.
|
|
23
|
+
|
|
24
|
+
AUTHOR:
|
|
25
|
+
|
|
26
|
+
- Jeroen Demeyer (2015-05-22): initial version, see :issue:`18329`
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
# ****************************************************************************
|
|
30
|
+
# Copyright (C) 2015 Jeroen Demeyer <jdemeyer@cage.ugent.be>
|
|
31
|
+
#
|
|
32
|
+
# This program is free software: you can redistribute it and/or modify
|
|
33
|
+
# it under the terms of the GNU General Public License as published by
|
|
34
|
+
# the Free Software Foundation, either version 2 of the License, or
|
|
35
|
+
# (at your option) any later version.
|
|
36
|
+
# https://www.gnu.org/licenses/
|
|
37
|
+
# ****************************************************************************
|
|
38
|
+
|
|
39
|
+
from cpython.object cimport PyTypeObject
|
|
40
|
+
from sage.misc.classcall_metaclass cimport ClasscallMetaclass
|
|
41
|
+
|
|
42
|
+
cdef extern from "inherit_comparison_impl.c":
|
|
43
|
+
void inherit_comparison(PyTypeObject* dst, PyTypeObject* src)
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
cdef class InheritComparisonMetaclass(type):
|
|
47
|
+
"""
|
|
48
|
+
If the type does not define ``__richcmp__`` nor ``__cmp__``,
|
|
49
|
+
inherit both these methods from the base class. The difference with
|
|
50
|
+
plain extension types is that comparison is inherited even if
|
|
51
|
+
``__hash__`` is defined.
|
|
52
|
+
|
|
53
|
+
EXAMPLES::
|
|
54
|
+
|
|
55
|
+
sage: # needs sage.misc.cython
|
|
56
|
+
sage: cython(
|
|
57
|
+
....: '''
|
|
58
|
+
....: cimport cython
|
|
59
|
+
....:
|
|
60
|
+
....: from sage.misc.inherit_comparison cimport InheritComparisonMetaclass
|
|
61
|
+
....:
|
|
62
|
+
....: cdef class Base():
|
|
63
|
+
....: def __richcmp__(left, right, int op):
|
|
64
|
+
....: print("Calling Base.__richcmp__")
|
|
65
|
+
....: return left is right
|
|
66
|
+
....:
|
|
67
|
+
....: cdef class Derived(Base):
|
|
68
|
+
....: def __hash__(self):
|
|
69
|
+
....: return 1
|
|
70
|
+
....:
|
|
71
|
+
....: cdef class DerivedWithRichcmp(Base):
|
|
72
|
+
....: @cython.always_allow_keywords(False)
|
|
73
|
+
....: def __getmetaclass__(_):
|
|
74
|
+
....: from sage.misc.inherit_comparison import InheritComparisonMetaclass
|
|
75
|
+
....: return InheritComparisonMetaclass
|
|
76
|
+
....: def __hash__(self):
|
|
77
|
+
....: return 1
|
|
78
|
+
....: ''')
|
|
79
|
+
sage: a = Derived()
|
|
80
|
+
sage: a == a
|
|
81
|
+
True
|
|
82
|
+
sage: b = DerivedWithRichcmp()
|
|
83
|
+
sage: b == b
|
|
84
|
+
Calling Base.__richcmp__
|
|
85
|
+
True
|
|
86
|
+
"""
|
|
87
|
+
def __init__(self, *args):
|
|
88
|
+
cdef PyTypeObject* t = <PyTypeObject*>self
|
|
89
|
+
cdef PyTypeObject* b = t.tp_base
|
|
90
|
+
if b:
|
|
91
|
+
inherit_comparison(t, b)
|
|
92
|
+
super(InheritComparisonMetaclass, self).__init__(*args)
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
class InheritComparisonClasscallMetaclass(ClasscallMetaclass, InheritComparisonMetaclass):
|
|
96
|
+
"""
|
|
97
|
+
Combine :class:`ClasscallMetaclass` with
|
|
98
|
+
:class:`InheritComparisonMetaclass`.
|
|
99
|
+
|
|
100
|
+
TESTS::
|
|
101
|
+
|
|
102
|
+
sage: from sage.misc.inherit_comparison import InheritComparisonClasscallMetaclass as M
|
|
103
|
+
sage: M.__new__(M, "myclass", (object,), {})
|
|
104
|
+
<class '__main__.myclass'>
|
|
105
|
+
"""
|
|
Binary file
|