passagemath-objects 10.6.45__cp313-cp313-musllinux_1_2_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/__init__.py +3 -0
  2. passagemath_objects-10.6.45.dist-info/METADATA +115 -0
  3. passagemath_objects-10.6.45.dist-info/RECORD +280 -0
  4. passagemath_objects-10.6.45.dist-info/WHEEL +5 -0
  5. passagemath_objects-10.6.45.dist-info/top_level.txt +3 -0
  6. passagemath_objects.libs/libgmp-0e7fc84e.so.10.5.0 +0 -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-313-x86_64-linux-musl.so +0 -0
  11. sage/arith/numerical_approx.pxd +35 -0
  12. sage/arith/numerical_approx.pyx +75 -0
  13. sage/arith/power.cpython-313-x86_64-linux-musl.so +0 -0
  14. sage/arith/power.pxd +31 -0
  15. sage/arith/power.pyx +127 -0
  16. sage/categories/action.cpython-313-x86_64-linux-musl.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-313-x86_64-linux-musl.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-313-x86_64-linux-musl.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-313-x86_64-linux-musl.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-313-x86_64-linux-musl.so +0 -0
  41. sage/categories/map.pxd +34 -0
  42. sage/categories/map.pyx +2106 -0
  43. sage/categories/morphism.cpython-313-x86_64-linux-musl.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-313-x86_64-linux-musl.so +0 -0
  60. sage/cpython/atexit.pyx +269 -0
  61. sage/cpython/builtin_types.cpython-313-x86_64-linux-musl.so +0 -0
  62. sage/cpython/builtin_types.pyx +7 -0
  63. sage/cpython/cython_metaclass.cpython-313-x86_64-linux-musl.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-313-x86_64-linux-musl.so +0 -0
  68. sage/cpython/debug.pyx +302 -0
  69. sage/cpython/dict_del_by_value.cpython-313-x86_64-linux-musl.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-313-x86_64-linux-musl.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-313-x86_64-linux-musl.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-313-x86_64-linux-musl.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-313-x86_64-linux-musl.so +0 -0
  97. sage/groups/group.pxd +14 -0
  98. sage/groups/group.pyx +322 -0
  99. sage/groups/old.cpython-313-x86_64-linux-musl.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-313-x86_64-linux-musl.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-313-x86_64-linux-musl.so +0 -0
  122. sage/misc/c3_controlled.pxd +2 -0
  123. sage/misc/c3_controlled.pyx +1402 -0
  124. sage/misc/cachefunc.cpython-313-x86_64-linux-musl.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-313-x86_64-linux-musl.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-313-x86_64-linux-musl.so +0 -0
  132. sage/misc/constant_function.pyx +130 -0
  133. sage/misc/decorators.py +747 -0
  134. sage/misc/fast_methods.cpython-313-x86_64-linux-musl.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-313-x86_64-linux-musl.so +0 -0
  139. sage/misc/fpickle.pyx +177 -0
  140. sage/misc/function_mangling.cpython-313-x86_64-linux-musl.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-313-x86_64-linux-musl.so +0 -0
  144. sage/misc/inherit_comparison.pxd +5 -0
  145. sage/misc/inherit_comparison.pyx +105 -0
  146. sage/misc/instancedoc.cpython-313-x86_64-linux-musl.so +0 -0
  147. sage/misc/instancedoc.pyx +331 -0
  148. sage/misc/lazy_attribute.cpython-313-x86_64-linux-musl.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-313-x86_64-linux-musl.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-313-x86_64-linux-musl.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-313-x86_64-linux-musl.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-313-x86_64-linux-musl.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-313-x86_64-linux-musl.so +0 -0
  166. sage/misc/nested_class.pxd +3 -0
  167. sage/misc/nested_class.pyx +394 -0
  168. sage/misc/persist.cpython-313-x86_64-linux-musl.so +0 -0
  169. sage/misc/persist.pyx +1251 -0
  170. sage/misc/prandom.py +418 -0
  171. sage/misc/randstate.cpython-313-x86_64-linux-musl.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-313-x86_64-linux-musl.so +0 -0
  176. sage/misc/reset.pyx +196 -0
  177. sage/misc/sage_ostools.cpython-313-x86_64-linux-musl.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-313-x86_64-linux-musl.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-313-x86_64-linux-musl.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-313-x86_64-linux-musl.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-313-x86_64-linux-musl.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-313-x86_64-linux-musl.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-313-x86_64-linux-musl.so +0 -0
  208. sage/structure/category_object.pxd +28 -0
  209. sage/structure/category_object.pyx +1087 -0
  210. sage/structure/coerce.cpython-313-x86_64-linux-musl.so +0 -0
  211. sage/structure/coerce.pxd +44 -0
  212. sage/structure/coerce.pyx +2107 -0
  213. sage/structure/coerce_actions.cpython-313-x86_64-linux-musl.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-313-x86_64-linux-musl.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-313-x86_64-linux-musl.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-313-x86_64-linux-musl.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-313-x86_64-linux-musl.so +0 -0
  228. sage/structure/element.pxd +272 -0
  229. sage/structure/element.pyx +4772 -0
  230. sage/structure/element_wrapper.cpython-313-x86_64-linux-musl.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-313-x86_64-linux-musl.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-313-x86_64-linux-musl.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-313-x86_64-linux-musl.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-313-x86_64-linux-musl.so +0 -0
  248. sage/structure/list_clone_timings_cy.pyx +86 -0
  249. sage/structure/mutability.cpython-313-x86_64-linux-musl.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-313-x86_64-linux-musl.so +0 -0
  254. sage/structure/parent.pxd +112 -0
  255. sage/structure/parent.pyx +3093 -0
  256. sage/structure/parent_base.cpython-313-x86_64-linux-musl.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-313-x86_64-linux-musl.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-313-x86_64-linux-musl.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-313-x86_64-linux-musl.so +0 -0
  269. sage/structure/richcmp.pxd +213 -0
  270. sage/structure/richcmp.pyx +495 -0
  271. sage/structure/sage_object.cpython-313-x86_64-linux-musl.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
@@ -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)
@@ -0,0 +1,5 @@
1
+ # sage_setup: distribution = sagemath-objects
2
+ cimport sage.cpython.cython_metaclass
3
+
4
+ cdef class InheritComparisonMetaclass(type):
5
+ pass
@@ -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
+ """