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.
Files changed (280) hide show
  1. passagemath_objects/.dylibs/libgmp.10.dylib +0 -0
  2. passagemath_objects/__init__.py +3 -0
  3. passagemath_objects-10.6.44.dist-info/METADATA +115 -0
  4. passagemath_objects-10.6.44.dist-info/RECORD +280 -0
  5. passagemath_objects-10.6.44.dist-info/WHEEL +6 -0
  6. passagemath_objects-10.6.44.dist-info/top_level.txt +3 -0
  7. sage/all__sagemath_objects.py +37 -0
  8. sage/arith/all__sagemath_objects.py +5 -0
  9. sage/arith/long.pxd +411 -0
  10. sage/arith/numerical_approx.cpython-314t-darwin.so +0 -0
  11. sage/arith/numerical_approx.pxd +35 -0
  12. sage/arith/numerical_approx.pyx +75 -0
  13. sage/arith/power.cpython-314t-darwin.so +0 -0
  14. sage/arith/power.pxd +31 -0
  15. sage/arith/power.pyx +127 -0
  16. sage/categories/action.cpython-314t-darwin.so +0 -0
  17. sage/categories/action.pxd +29 -0
  18. sage/categories/action.pyx +641 -0
  19. sage/categories/algebra_functor.py +745 -0
  20. sage/categories/all__sagemath_objects.py +33 -0
  21. sage/categories/basic.py +62 -0
  22. sage/categories/cartesian_product.py +295 -0
  23. sage/categories/category.py +3401 -0
  24. sage/categories/category_cy_helper.cpython-314t-darwin.so +0 -0
  25. sage/categories/category_cy_helper.pxd +8 -0
  26. sage/categories/category_cy_helper.pyx +322 -0
  27. sage/categories/category_singleton.cpython-314t-darwin.so +0 -0
  28. sage/categories/category_singleton.pxd +3 -0
  29. sage/categories/category_singleton.pyx +342 -0
  30. sage/categories/category_types.py +637 -0
  31. sage/categories/category_with_axiom.py +2876 -0
  32. sage/categories/covariant_functorial_construction.py +703 -0
  33. sage/categories/facade_sets.py +228 -0
  34. sage/categories/functor.cpython-314t-darwin.so +0 -0
  35. sage/categories/functor.pxd +7 -0
  36. sage/categories/functor.pyx +691 -0
  37. sage/categories/homset.py +1338 -0
  38. sage/categories/homsets.py +364 -0
  39. sage/categories/isomorphic_objects.py +73 -0
  40. sage/categories/map.cpython-314t-darwin.so +0 -0
  41. sage/categories/map.pxd +34 -0
  42. sage/categories/map.pyx +2106 -0
  43. sage/categories/morphism.cpython-314t-darwin.so +0 -0
  44. sage/categories/morphism.pxd +14 -0
  45. sage/categories/morphism.pyx +895 -0
  46. sage/categories/objects.py +167 -0
  47. sage/categories/primer.py +1696 -0
  48. sage/categories/pushout.py +4834 -0
  49. sage/categories/quotients.py +64 -0
  50. sage/categories/realizations.py +200 -0
  51. sage/categories/sets_cat.py +3290 -0
  52. sage/categories/sets_with_partial_maps.py +52 -0
  53. sage/categories/subobjects.py +64 -0
  54. sage/categories/subquotients.py +21 -0
  55. sage/categories/with_realizations.py +311 -0
  56. sage/cpython/__init__.py +19 -0
  57. sage/cpython/_py2_random.py +619 -0
  58. sage/cpython/all.py +3 -0
  59. sage/cpython/atexit.cpython-314t-darwin.so +0 -0
  60. sage/cpython/atexit.pyx +269 -0
  61. sage/cpython/builtin_types.cpython-314t-darwin.so +0 -0
  62. sage/cpython/builtin_types.pyx +7 -0
  63. sage/cpython/cython_metaclass.cpython-314t-darwin.so +0 -0
  64. sage/cpython/cython_metaclass.h +117 -0
  65. sage/cpython/cython_metaclass.pxd +3 -0
  66. sage/cpython/cython_metaclass.pyx +130 -0
  67. sage/cpython/debug.cpython-314t-darwin.so +0 -0
  68. sage/cpython/debug.pyx +302 -0
  69. sage/cpython/dict_del_by_value.cpython-314t-darwin.so +0 -0
  70. sage/cpython/dict_del_by_value.pxd +9 -0
  71. sage/cpython/dict_del_by_value.pyx +191 -0
  72. sage/cpython/dict_internal.h +245 -0
  73. sage/cpython/getattr.cpython-314t-darwin.so +0 -0
  74. sage/cpython/getattr.pxd +9 -0
  75. sage/cpython/getattr.pyx +439 -0
  76. sage/cpython/pycore_long.h +97 -0
  77. sage/cpython/pycore_long.pxd +10 -0
  78. sage/cpython/python_debug.h +44 -0
  79. sage/cpython/python_debug.pxd +47 -0
  80. sage/cpython/pyx_visit.h +13 -0
  81. sage/cpython/string.cpython-314t-darwin.so +0 -0
  82. sage/cpython/string.pxd +76 -0
  83. sage/cpython/string.pyx +34 -0
  84. sage/cpython/string_impl.h +60 -0
  85. sage/cpython/type.cpython-314t-darwin.so +0 -0
  86. sage/cpython/type.pxd +2 -0
  87. sage/cpython/type.pyx +40 -0
  88. sage/cpython/wrapperdescr.pxd +67 -0
  89. sage/ext/all__sagemath_objects.py +3 -0
  90. sage/ext/ccobject.h +64 -0
  91. sage/ext/cplusplus.pxd +17 -0
  92. sage/ext/mod_int.h +30 -0
  93. sage/ext/mod_int.pxd +24 -0
  94. sage/ext/stdsage.pxd +39 -0
  95. sage/groups/all__sagemath_objects.py +1 -0
  96. sage/groups/group.cpython-314t-darwin.so +0 -0
  97. sage/groups/group.pxd +14 -0
  98. sage/groups/group.pyx +322 -0
  99. sage/groups/old.cpython-314t-darwin.so +0 -0
  100. sage/groups/old.pxd +14 -0
  101. sage/groups/old.pyx +219 -0
  102. sage/libs/all__sagemath_objects.py +3 -0
  103. sage/libs/gmp/__init__.py +1 -0
  104. sage/libs/gmp/all.pxd +6 -0
  105. sage/libs/gmp/binop.pxd +23 -0
  106. sage/libs/gmp/misc.pxd +8 -0
  107. sage/libs/gmp/mpf.pxd +88 -0
  108. sage/libs/gmp/mpn.pxd +57 -0
  109. sage/libs/gmp/mpq.pxd +57 -0
  110. sage/libs/gmp/mpz.pxd +202 -0
  111. sage/libs/gmp/pylong.cpython-314t-darwin.so +0 -0
  112. sage/libs/gmp/pylong.pxd +12 -0
  113. sage/libs/gmp/pylong.pyx +150 -0
  114. sage/libs/gmp/random.pxd +25 -0
  115. sage/libs/gmp/randomize.pxd +59 -0
  116. sage/libs/gmp/types.pxd +53 -0
  117. sage/libs/gmpxx.pxd +19 -0
  118. sage/misc/abstract_method.py +276 -0
  119. sage/misc/all__sagemath_objects.py +43 -0
  120. sage/misc/bindable_class.py +253 -0
  121. sage/misc/c3_controlled.cpython-314t-darwin.so +0 -0
  122. sage/misc/c3_controlled.pxd +2 -0
  123. sage/misc/c3_controlled.pyx +1402 -0
  124. sage/misc/cachefunc.cpython-314t-darwin.so +0 -0
  125. sage/misc/cachefunc.pxd +43 -0
  126. sage/misc/cachefunc.pyx +3781 -0
  127. sage/misc/call.py +188 -0
  128. sage/misc/classcall_metaclass.cpython-314t-darwin.so +0 -0
  129. sage/misc/classcall_metaclass.pxd +14 -0
  130. sage/misc/classcall_metaclass.pyx +599 -0
  131. sage/misc/constant_function.cpython-314t-darwin.so +0 -0
  132. sage/misc/constant_function.pyx +130 -0
  133. sage/misc/decorators.py +747 -0
  134. sage/misc/fast_methods.cpython-314t-darwin.so +0 -0
  135. sage/misc/fast_methods.pxd +20 -0
  136. sage/misc/fast_methods.pyx +351 -0
  137. sage/misc/flatten.py +90 -0
  138. sage/misc/fpickle.cpython-314t-darwin.so +0 -0
  139. sage/misc/fpickle.pyx +177 -0
  140. sage/misc/function_mangling.cpython-314t-darwin.so +0 -0
  141. sage/misc/function_mangling.pxd +11 -0
  142. sage/misc/function_mangling.pyx +308 -0
  143. sage/misc/inherit_comparison.cpython-314t-darwin.so +0 -0
  144. sage/misc/inherit_comparison.pxd +5 -0
  145. sage/misc/inherit_comparison.pyx +105 -0
  146. sage/misc/instancedoc.cpython-314t-darwin.so +0 -0
  147. sage/misc/instancedoc.pyx +331 -0
  148. sage/misc/lazy_attribute.cpython-314t-darwin.so +0 -0
  149. sage/misc/lazy_attribute.pyx +607 -0
  150. sage/misc/lazy_format.py +135 -0
  151. sage/misc/lazy_import.cpython-314t-darwin.so +0 -0
  152. sage/misc/lazy_import.pyx +1299 -0
  153. sage/misc/lazy_import_cache.py +36 -0
  154. sage/misc/lazy_list.cpython-314t-darwin.so +0 -0
  155. sage/misc/lazy_list.pxd +19 -0
  156. sage/misc/lazy_list.pyx +1187 -0
  157. sage/misc/lazy_string.cpython-314t-darwin.so +0 -0
  158. sage/misc/lazy_string.pxd +7 -0
  159. sage/misc/lazy_string.pyx +546 -0
  160. sage/misc/misc.py +1066 -0
  161. sage/misc/misc_c.cpython-314t-darwin.so +0 -0
  162. sage/misc/misc_c.pxd +3 -0
  163. sage/misc/misc_c.pyx +766 -0
  164. sage/misc/namespace_package.py +37 -0
  165. sage/misc/nested_class.cpython-314t-darwin.so +0 -0
  166. sage/misc/nested_class.pxd +3 -0
  167. sage/misc/nested_class.pyx +394 -0
  168. sage/misc/persist.cpython-314t-darwin.so +0 -0
  169. sage/misc/persist.pyx +1251 -0
  170. sage/misc/prandom.py +418 -0
  171. sage/misc/randstate.cpython-314t-darwin.so +0 -0
  172. sage/misc/randstate.pxd +30 -0
  173. sage/misc/randstate.pyx +1059 -0
  174. sage/misc/repr.py +203 -0
  175. sage/misc/reset.cpython-314t-darwin.so +0 -0
  176. sage/misc/reset.pyx +196 -0
  177. sage/misc/sage_ostools.cpython-314t-darwin.so +0 -0
  178. sage/misc/sage_ostools.pyx +323 -0
  179. sage/misc/sage_timeit.py +275 -0
  180. sage/misc/sage_timeit_class.cpython-314t-darwin.so +0 -0
  181. sage/misc/sage_timeit_class.pyx +120 -0
  182. sage/misc/sage_unittest.py +637 -0
  183. sage/misc/sageinspect.py +2768 -0
  184. sage/misc/session.cpython-314t-darwin.so +0 -0
  185. sage/misc/session.pyx +392 -0
  186. sage/misc/superseded.py +557 -0
  187. sage/misc/test_nested_class.py +228 -0
  188. sage/misc/timing.py +264 -0
  189. sage/misc/unknown.py +222 -0
  190. sage/misc/verbose.py +253 -0
  191. sage/misc/weak_dict.cpython-314t-darwin.so +0 -0
  192. sage/misc/weak_dict.pxd +15 -0
  193. sage/misc/weak_dict.pyx +1231 -0
  194. sage/modules/all__sagemath_objects.py +1 -0
  195. sage/modules/module.cpython-314t-darwin.so +0 -0
  196. sage/modules/module.pxd +5 -0
  197. sage/modules/module.pyx +329 -0
  198. sage/rings/all__sagemath_objects.py +3 -0
  199. sage/rings/integer_fake.h +22 -0
  200. sage/rings/integer_fake.pxd +55 -0
  201. sage/sets/all__sagemath_objects.py +3 -0
  202. sage/sets/pythonclass.cpython-314t-darwin.so +0 -0
  203. sage/sets/pythonclass.pxd +9 -0
  204. sage/sets/pythonclass.pyx +247 -0
  205. sage/structure/__init__.py +4 -0
  206. sage/structure/all.py +30 -0
  207. sage/structure/category_object.cpython-314t-darwin.so +0 -0
  208. sage/structure/category_object.pxd +28 -0
  209. sage/structure/category_object.pyx +1087 -0
  210. sage/structure/coerce.cpython-314t-darwin.so +0 -0
  211. sage/structure/coerce.pxd +44 -0
  212. sage/structure/coerce.pyx +2107 -0
  213. sage/structure/coerce_actions.cpython-314t-darwin.so +0 -0
  214. sage/structure/coerce_actions.pxd +27 -0
  215. sage/structure/coerce_actions.pyx +988 -0
  216. sage/structure/coerce_dict.cpython-314t-darwin.so +0 -0
  217. sage/structure/coerce_dict.pxd +51 -0
  218. sage/structure/coerce_dict.pyx +1557 -0
  219. sage/structure/coerce_exceptions.py +23 -0
  220. sage/structure/coerce_maps.cpython-314t-darwin.so +0 -0
  221. sage/structure/coerce_maps.pxd +28 -0
  222. sage/structure/coerce_maps.pyx +718 -0
  223. sage/structure/debug_options.cpython-314t-darwin.so +0 -0
  224. sage/structure/debug_options.pxd +6 -0
  225. sage/structure/debug_options.pyx +54 -0
  226. sage/structure/dynamic_class.py +541 -0
  227. sage/structure/element.cpython-314t-darwin.so +0 -0
  228. sage/structure/element.pxd +272 -0
  229. sage/structure/element.pyx +4772 -0
  230. sage/structure/element_wrapper.cpython-314t-darwin.so +0 -0
  231. sage/structure/element_wrapper.pxd +12 -0
  232. sage/structure/element_wrapper.pyx +582 -0
  233. sage/structure/factorization.py +1422 -0
  234. sage/structure/factorization_integer.py +105 -0
  235. sage/structure/factory.cpython-314t-darwin.so +0 -0
  236. sage/structure/factory.pyx +786 -0
  237. sage/structure/formal_sum.py +489 -0
  238. sage/structure/gens_py.py +73 -0
  239. sage/structure/global_options.py +1743 -0
  240. sage/structure/indexed_generators.py +863 -0
  241. sage/structure/list_clone.cpython-314t-darwin.so +0 -0
  242. sage/structure/list_clone.pxd +65 -0
  243. sage/structure/list_clone.pyx +1867 -0
  244. sage/structure/list_clone_demo.cpython-314t-darwin.so +0 -0
  245. sage/structure/list_clone_demo.pyx +248 -0
  246. sage/structure/list_clone_timings.py +179 -0
  247. sage/structure/list_clone_timings_cy.cpython-314t-darwin.so +0 -0
  248. sage/structure/list_clone_timings_cy.pyx +86 -0
  249. sage/structure/mutability.cpython-314t-darwin.so +0 -0
  250. sage/structure/mutability.pxd +21 -0
  251. sage/structure/mutability.pyx +348 -0
  252. sage/structure/nonexact.py +69 -0
  253. sage/structure/parent.cpython-314t-darwin.so +0 -0
  254. sage/structure/parent.pxd +112 -0
  255. sage/structure/parent.pyx +3093 -0
  256. sage/structure/parent_base.cpython-314t-darwin.so +0 -0
  257. sage/structure/parent_base.pxd +13 -0
  258. sage/structure/parent_base.pyx +44 -0
  259. sage/structure/parent_gens.cpython-314t-darwin.so +0 -0
  260. sage/structure/parent_gens.pxd +22 -0
  261. sage/structure/parent_gens.pyx +377 -0
  262. sage/structure/parent_old.cpython-314t-darwin.so +0 -0
  263. sage/structure/parent_old.pxd +25 -0
  264. sage/structure/parent_old.pyx +294 -0
  265. sage/structure/proof/__init__.py +1 -0
  266. sage/structure/proof/all.py +243 -0
  267. sage/structure/proof/proof.py +300 -0
  268. sage/structure/richcmp.cpython-314t-darwin.so +0 -0
  269. sage/structure/richcmp.pxd +213 -0
  270. sage/structure/richcmp.pyx +495 -0
  271. sage/structure/sage_object.cpython-314t-darwin.so +0 -0
  272. sage/structure/sage_object.pxd +3 -0
  273. sage/structure/sage_object.pyx +988 -0
  274. sage/structure/sage_object_test.py +19 -0
  275. sage/structure/sequence.py +937 -0
  276. sage/structure/set_factories.py +1178 -0
  277. sage/structure/set_factories_example.py +527 -0
  278. sage/structure/support_view.py +179 -0
  279. sage/structure/test_factory.py +56 -0
  280. sage/structure/unique_representation.py +1359 -0
@@ -0,0 +1,53 @@
1
+ # sage_setup: distribution = sagemath-objects
2
+ from libc.stdio cimport FILE
3
+
4
+ cdef extern from "gmp.h":
5
+ # GMP's configuration of how many bits are stuffed into a limb
6
+ cdef unsigned int GMP_LIMB_BITS
7
+ cdef int mp_bits_per_limb
8
+
9
+ # Underlying typedefs
10
+ ctypedef unsigned long mp_limb_t
11
+ ctypedef long mp_limb_signed_t
12
+ ctypedef unsigned long mp_bitcnt_t
13
+ ctypedef long mp_size_t
14
+ ctypedef long mp_exp_t
15
+
16
+ ctypedef mp_limb_t* mp_ptr
17
+ ctypedef mp_limb_t* mp_srcptr
18
+
19
+ # This internal structure is not guaranteed to stay the same with
20
+ # future releases of GMP or MPIR.
21
+ ctypedef struct __mpz_struct:
22
+ int _mp_alloc
23
+ int _mp_size
24
+ mp_ptr _mp_d
25
+
26
+ ctypedef struct __mpq_struct:
27
+ __mpz_struct _mp_num
28
+ __mpz_struct _mp_den
29
+
30
+ ctypedef struct __mpf_struct:
31
+ int _mp_prec
32
+ int _mp_size
33
+ mp_exp_t _mp_exp
34
+ mp_limb_t *_mp_d
35
+
36
+ ctypedef struct __gmp_randstate_struct:
37
+ pass
38
+
39
+ # User facing types
40
+ ctypedef __mpz_struct mpz_t[1]
41
+ ctypedef __mpq_struct mpq_t[1]
42
+ ctypedef __mpf_struct mpf_t[1]
43
+ ctypedef __gmp_randstate_struct gmp_randstate_t[1]
44
+
45
+ ctypedef __mpz_struct *mpz_ptr
46
+ ctypedef __mpq_struct *mpq_ptr
47
+ ctypedef __mpf_struct *mpf_ptr
48
+ ctypedef __mpz_struct *mpz_srcptr
49
+ ctypedef __mpq_struct *mpq_srcptr
50
+ ctypedef __mpf_struct *mpf_srcptr
51
+
52
+ # Cython doesn't want to take the address of an mpz_t
53
+ cdef mpz_t* address_of_mpz "&"(mpz_t x)
sage/libs/gmpxx.pxd ADDED
@@ -0,0 +1,19 @@
1
+ # sage_setup: distribution = sagemath-objects
2
+ # distutils: language = c++
3
+ # distutils: libraries = gmpxx gmp
4
+
5
+ from sage.libs.gmp.types cimport mpz_t, mpq_t
6
+
7
+ cdef extern from 'gmpxx.h':
8
+ cdef cppclass mpz_class:
9
+ mpz_class()
10
+ mpz_class(int i)
11
+ mpz_class(mpz_t z)
12
+ mpz_class(mpz_class)
13
+ mpz_t get_mpz_t()
14
+ mpz_class operator % (mpz_class, mpz_class)
15
+
16
+ cdef cppclass mpq_class:
17
+ mpq_class()
18
+ mpz_t get_num_mpz_t()
19
+ mpz_t get_den_mpz_t()
@@ -0,0 +1,276 @@
1
+ # sage_setup: distribution = sagemath-objects
2
+ """
3
+ Abstract methods
4
+ """
5
+ # ****************************************************************************
6
+ # Copyright (C) 2008 Nicolas M. Thiery <nthiery at users.sf.net>
7
+ #
8
+ # Distributed under the terms of the GNU General Public License (GPL)
9
+ # https://www.gnu.org/licenses/
10
+ # ****************************************************************************
11
+
12
+ import types
13
+
14
+
15
+ def abstract_method(f=None, optional=False):
16
+ r"""
17
+ Abstract methods.
18
+
19
+ INPUT:
20
+
21
+ - ``f`` -- a function
22
+ - ``optional`` -- boolean (default: ``False``)
23
+
24
+ The decorator :obj:`abstract_method` can be used to declare
25
+ methods that should be implemented by all concrete derived
26
+ classes. This declaration should typically include documentation
27
+ for the specification for this method.
28
+
29
+ The purpose is to enforce a consistent and visual syntax for such
30
+ declarations. It is used by the Sage categories for automated
31
+ tests (see ``Sets.Parent.test_not_implemented``).
32
+
33
+ EXAMPLES:
34
+
35
+ We create a class with an abstract method::
36
+
37
+ sage: class A():
38
+ ....:
39
+ ....: @abstract_method
40
+ ....: def my_method(self):
41
+ ....: '''
42
+ ....: The method :meth:`my_method` computes my_method
43
+ ....:
44
+ ....: EXAMPLES::
45
+ ....:
46
+ ....: '''
47
+ ....: pass
48
+
49
+ sage: A.my_method
50
+ <abstract method my_method at ...>
51
+
52
+ The current policy is that a :exc:`NotImplementedError` is raised
53
+ when accessing the method through an instance, even before the
54
+ method is called::
55
+
56
+ sage: x = A()
57
+ sage: x.my_method
58
+ Traceback (most recent call last):
59
+ ...
60
+ NotImplementedError: <abstract method my_method at ...>
61
+
62
+ It is also possible to mark abstract methods as optional::
63
+
64
+ sage: class A():
65
+ ....:
66
+ ....: @abstract_method(optional = True)
67
+ ....: def my_method(self):
68
+ ....: '''
69
+ ....: The method :meth:`my_method` computes my_method
70
+ ....:
71
+ ....: EXAMPLES::
72
+ ....:
73
+ ....: '''
74
+ ....: pass
75
+
76
+ sage: A.my_method
77
+ <optional abstract method my_method at ...>
78
+
79
+ sage: x = A()
80
+ sage: x.my_method
81
+ NotImplemented
82
+
83
+ The official mantra for testing whether an optional abstract
84
+ method is implemented is::
85
+
86
+ sage: if x.my_method is not NotImplemented:
87
+ ....: x.my_method()
88
+ ....: else:
89
+ ....: print("x.my_method is not available.")
90
+ x.my_method is not available.
91
+
92
+ .. rubric:: Discussion
93
+
94
+ The policy details are not yet fixed. The purpose of this first
95
+ implementation is to let developers experiment with it and give
96
+ feedback on what's most practical.
97
+
98
+ The advantage of the current policy is that attempts at using a
99
+ non implemented methods are caught as early as possible. On the
100
+ other hand, one cannot use introspection directly to fetch the
101
+ documentation::
102
+
103
+ sage: x.my_method? # todo: not implemented
104
+
105
+ Instead one needs to do::
106
+
107
+ sage: A._my_method? # todo: not implemented
108
+
109
+ This could probably be fixed in :mod:`sage.misc.sageinspect`.
110
+
111
+ .. TODO:: what should be the recommended mantra for existence testing from the class?
112
+
113
+ .. TODO::
114
+
115
+ should extra information appear in the output? The name of the
116
+ class? That of the super class where the abstract method is
117
+ defined?
118
+
119
+ .. TODO:: look for similar decorators on the web, and merge
120
+
121
+ .. rubric:: Implementation details
122
+
123
+ Technically, an abstract_method is a non-data descriptor (see
124
+ Invoking Descriptors in the Python reference manual).
125
+
126
+ The syntax ``@abstract_method`` w.r.t. @abstract_method(optional = True)
127
+ is achieved by a little trick which we test here::
128
+
129
+ sage: abstract_method(optional = True)
130
+ <function abstract_method.<locals>.<lambda> at ...>
131
+ sage: abstract_method(optional = True)(version)
132
+ <optional abstract method version at ...>
133
+ sage: abstract_method(version, optional = True)
134
+ <optional abstract method version at ...>
135
+ """
136
+ if f is None:
137
+ return lambda f: AbstractMethod(f, optional=optional)
138
+ else:
139
+ return AbstractMethod(f, optional)
140
+
141
+
142
+ class AbstractMethod:
143
+ def __init__(self, f, optional=False):
144
+ """
145
+ Constructor for abstract methods.
146
+
147
+ EXAMPLES::
148
+
149
+ sage: def f(x):
150
+ ....: "doc of f"
151
+ ....: return 1
152
+ sage: x = abstract_method(f); x
153
+ <abstract method f at ...>
154
+ sage: x.__doc__
155
+ 'doc of f'
156
+ sage: x.__name__
157
+ 'f'
158
+ sage: x.__module__
159
+ '__main__'
160
+ """
161
+ assert (isinstance(f, types.FunctionType) or
162
+ getattr(type(f), '__name__', None) == 'cython_function_or_method')
163
+ assert isinstance(optional, bool)
164
+ self._f = f
165
+ self._optional = optional
166
+ self.__doc__ = f.__doc__
167
+ self.__name__ = f.__name__
168
+ try:
169
+ self.__module__ = f.__module__
170
+ except AttributeError:
171
+ pass
172
+
173
+ def __repr__(self):
174
+ """
175
+ EXAMPLES::
176
+
177
+ sage: abstract_method(version)
178
+ <abstract method version at ...>
179
+
180
+ sage: abstract_method(version, optional = True)
181
+ <optional abstract method version at ...>
182
+ """
183
+ return "<" + ("optional " if self._optional else "") + "abstract method %s at %s>" % (self.__name__, hex(id(self._f)))
184
+
185
+ def _sage_src_lines_(self):
186
+ r"""
187
+ Return the source code location for the wrapped function.
188
+
189
+ EXAMPLES::
190
+
191
+ sage: from sage.misc.sageinspect import sage_getsourcelines
192
+ sage: g = abstract_method(version)
193
+ sage: (src, lines) = sage_getsourcelines(g)
194
+ sage: src[0]
195
+ 'def version():\n'
196
+ sage: lines
197
+ 20
198
+ """
199
+ from sage.misc.sageinspect import sage_getsourcelines
200
+ return sage_getsourcelines(self._f)
201
+
202
+ def __get__(self, instance, cls):
203
+ """
204
+ Implement the attribute access protocol.
205
+
206
+ EXAMPLES::
207
+
208
+ sage: class A: pass
209
+ sage: def f(x): return 1
210
+ sage: f = abstract_method(f)
211
+ sage: f.__get__(A(), A)
212
+ Traceback (most recent call last):
213
+ ...
214
+ NotImplementedError: <abstract method f at ...>
215
+ """
216
+ if instance is None:
217
+ return self
218
+ elif self._optional:
219
+ return NotImplemented
220
+ else:
221
+ raise NotImplementedError(repr(self))
222
+
223
+ def is_optional(self):
224
+ """
225
+ Return whether an abstract method is optional or not.
226
+
227
+ EXAMPLES::
228
+
229
+ sage: class AbstractClass:
230
+ ....: @abstract_method
231
+ ....: def required(): pass
232
+ ....:
233
+ ....: @abstract_method(optional = True)
234
+ ....: def optional(): pass
235
+ sage: AbstractClass.required.is_optional()
236
+ False
237
+ sage: AbstractClass.optional.is_optional()
238
+ True
239
+ """
240
+ return self._optional
241
+
242
+
243
+ def abstract_methods_of_class(cls):
244
+ """
245
+ Return the required and optional abstract methods of the class.
246
+
247
+ EXAMPLES::
248
+
249
+ sage: class AbstractClass:
250
+ ....: @abstract_method
251
+ ....: def required1(): pass
252
+ ....:
253
+ ....: @abstract_method(optional = True)
254
+ ....: def optional2(): pass
255
+ ....:
256
+ ....: @abstract_method(optional = True)
257
+ ....: def optional1(): pass
258
+ ....:
259
+ ....: @abstract_method
260
+ ....: def required2(): pass
261
+
262
+ sage: sage.misc.abstract_method.abstract_methods_of_class(AbstractClass)
263
+ {'optional': ['optional1', 'optional2'],
264
+ 'required': ['required1', 'required2']}
265
+ """
266
+ result = {"required": [],
267
+ "optional": []}
268
+ for name in dir(cls):
269
+ entry = getattr(cls, name)
270
+ if not isinstance(entry, AbstractMethod):
271
+ continue
272
+ if entry.is_optional():
273
+ result["optional"].append(name)
274
+ else:
275
+ result["required"].append(name)
276
+ return result
@@ -0,0 +1,43 @@
1
+ # sage_setup: distribution = sagemath-objects
2
+ # Subset of sage.misc.all that is made available by the sage-objects distribution
3
+
4
+ import sage.structure.all # to break a cyclic import
5
+
6
+ from sage.misc.lazy_attribute import lazy_attribute, lazy_class_attribute
7
+ from sage.misc.lazy_import import lazy_import
8
+
9
+ from sage.misc.verbose import (set_verbose, set_verbose_files,
10
+ get_verbose_files, unset_verbose_files, get_verbose)
11
+ lazy_import('sage.misc.verbose', 'verbose',
12
+ deprecation=17815)
13
+ from sage.misc.call import attrcall
14
+
15
+ from sage.misc.misc_c import prod, running_total, balanced_sum
16
+ mul = prod
17
+ add = sum
18
+
19
+ from sage.misc.repr import repr_lincomb
20
+
21
+ from sage.misc.flatten import flatten
22
+
23
+ from sage.misc.persist import save, load, dumps, loads, db, db_save
24
+
25
+ from sage.misc.constant_function import ConstantFunction
26
+
27
+ from sage.misc.sage_unittest import TestSuite
28
+
29
+ from sage.misc.decorators import specialize, sage_wraps, infix_operator
30
+
31
+ from sage.misc.unknown import Unknown, UnknownError
32
+
33
+ from sage.misc.cachefunc import CachedFunction, cached_function, cached_method, cached_in_parent_method, disk_cached_function
34
+
35
+ from sage.misc.abstract_method import abstract_method
36
+
37
+ from sage.misc.timing import walltime, cputime
38
+
39
+ from sage.misc.randstate import seed, set_random_seed, initial_seed, current_randstate
40
+ from sage.misc.prandom import *
41
+ from sage.misc.sage_timeit_class import timeit
42
+ from sage.misc.session import load_session, save_session, show_identifiers
43
+ from sage.misc.reset import reset, restore
@@ -0,0 +1,253 @@
1
+ # sage_setup: distribution = sagemath-objects
2
+ """
3
+ Bindable classes
4
+ """
5
+ # ****************************************************************************
6
+ # Copyright (C) 2012 Nicolas M. Thiery <nthiery at users.sf.net>
7
+ #
8
+ # This program is free software: you can redistribute it and/or modify
9
+ # it under the terms of the GNU General Public License as published by
10
+ # the Free Software Foundation, either version 2 of the License, or
11
+ # (at your option) any later version.
12
+ # https://www.gnu.org/licenses/
13
+ # ****************************************************************************
14
+ import functools
15
+ from sage.misc.nested_class import NestedClassMetaclass
16
+ from sage.misc.classcall_metaclass import ClasscallMetaclass
17
+
18
+
19
+ class BindableClass(metaclass=ClasscallMetaclass):
20
+ """
21
+ Bindable classes.
22
+
23
+ This class implements a binding behavior for nested classes that
24
+ derive from it. Namely, if a nested class ``Outer.Inner`` derives
25
+ from ``BindableClass``, and if ``outer`` is an instance of
26
+ ``Outer``, then ``outer.Inner(...)`` is equivalent to
27
+ ``Outer.Inner(outer, ...)``.
28
+
29
+ EXAMPLES:
30
+
31
+ Let us consider the following class ``Outer`` with a nested class ``Inner``::
32
+
33
+ sage: from sage.misc.nested_class import NestedClassMetaclass
34
+ sage: class Outer(metaclass=NestedClassMetaclass):
35
+ ....: class Inner:
36
+ ....: def __init__(self, *args):
37
+ ....: print(args)
38
+ ....: def f(self, *args):
39
+ ....: print("{} {}".format(self, args))
40
+ ....: @staticmethod
41
+ ....: def f_static(*args):
42
+ ....: print(args)
43
+
44
+ sage: outer = Outer()
45
+
46
+ By default, when ``Inner`` is a class nested in ``Outer``,
47
+ accessing ``outer.Inner`` returns the ``Inner`` class as is::
48
+
49
+ sage: outer.Inner is Outer.Inner
50
+ True
51
+
52
+ In particular, ``outer`` is completely ignored in the following call::
53
+
54
+ sage: x = outer.Inner(1,2,3)
55
+ (1, 2, 3)
56
+
57
+ This is similar to what happens with a static method::
58
+
59
+ sage: outer.f_static(1,2,3)
60
+ (1, 2, 3)
61
+
62
+ In some cases, we would want instead ``Inner`` to receive ``outer``
63
+ as parameter, like in a usual method call::
64
+
65
+ sage: outer.f(1,2,3)
66
+ <__main__.Outer object at ...> (1, 2, 3)
67
+
68
+ To this end, ``outer.f`` returns a *bound method*::
69
+
70
+ sage: outer.f
71
+ <bound method Outer.f of <__main__.Outer object at ...>>
72
+
73
+ so that ``outer.f(1,2,3)`` is equivalent to::
74
+
75
+ sage: Outer.f(outer, 1,2,3)
76
+ <__main__.Outer object at ...> (1, 2, 3)
77
+
78
+ :class:`BindableClass` gives this binding behavior to all its subclasses::
79
+
80
+ sage: from sage.misc.bindable_class import BindableClass
81
+ sage: class Outer(metaclass=NestedClassMetaclass):
82
+ ....: class Inner(BindableClass):
83
+ ....: " some documentation "
84
+ ....: def __init__(self, outer, *args):
85
+ ....: print("{} {}".format(outer, args))
86
+
87
+ Calling ``Outer.Inner`` returns the (unbound) class as usual::
88
+
89
+ sage: Outer.Inner
90
+ <class '__main__.Outer.Inner'>
91
+
92
+ However, ``outer.Inner(1,2,3)`` is equivalent to ``Outer.Inner(outer, 1,2,3)``::
93
+
94
+ sage: outer = Outer()
95
+ sage: x = outer.Inner(1,2,3)
96
+ <__main__.Outer object at ...> (1, 2, 3)
97
+
98
+ To achieve this, ``outer.Inner`` returns (some sort of) bound class::
99
+
100
+ sage: outer.Inner
101
+ <bound class '__main__.Outer.Inner' of <__main__.Outer object at ...>>
102
+
103
+ .. NOTE::
104
+
105
+ This is not actually a class, but an instance of
106
+ :class:`functools.partial`::
107
+
108
+ sage: type(outer.Inner).mro()
109
+ [<class 'sage.misc.bindable_class.BoundClass'>,
110
+ <... 'functools.partial'>,
111
+ <... 'object'>]
112
+
113
+ Still, documentation works as usual::
114
+
115
+ sage: outer.Inner.__doc__
116
+ '...some documentation '
117
+
118
+ TESTS::
119
+
120
+ sage: from sage.misc.bindable_class import Outer
121
+ sage: TestSuite(Outer.Inner).run()
122
+ sage: outer = Outer()
123
+ sage: TestSuite(outer.Inner).run(skip=["_test_pickling"])
124
+ """
125
+ @staticmethod
126
+ def __classget__(cls, instance, owner):
127
+ """
128
+ Bind ``cls`` to ``instance``, returning a ``BoundClass``.
129
+
130
+ INPUT:
131
+
132
+ - ``instance`` -- an object of the outer class or ``None``
133
+
134
+ For technical details, see the Section :python:`Implementing Descriptor
135
+ <reference/datamodel.html#implementing-descriptors>` in the Python
136
+ reference manual.
137
+
138
+ EXAMPLES::
139
+
140
+ sage: from sage.misc.bindable_class import Outer
141
+ sage: Outer.Inner
142
+ <class 'sage.misc.bindable_class.Outer.Inner'>
143
+ sage: Outer().Inner
144
+ <bound class 'sage.misc.bindable_class.Outer.Inner' of <sage.misc.bindable_class.Outer object at ...>>
145
+ """
146
+ if instance is None:
147
+ return cls
148
+ return BoundClass(cls, instance)
149
+ # We probably do not need to use sage_wraps, since
150
+ # sageinspect already supports partial functions
151
+ # return sage_wraps(cls)(BoundClass(cls, instance))
152
+
153
+
154
+ class BoundClass(functools.partial):
155
+ """
156
+ TESTS::
157
+
158
+ sage: from sage.misc.sageinspect import *
159
+ sage: from sage.misc.bindable_class import Outer
160
+ sage: x = Outer()
161
+ sage: c = x.Inner; c
162
+ <bound class 'sage.misc.bindable_class.Outer.Inner' of <sage.misc.bindable_class.Outer object at ...>>
163
+
164
+ Introspection works, at least partially::
165
+
166
+ sage: sage_getdoc(c).strip()
167
+ 'Some documentation for Outer.Inner'
168
+ sage: sage_getfile(c)
169
+ '.../sage/misc/bindable_class.py'
170
+
171
+ sage: c = x.Inner2
172
+ sage: sage_getdoc(c).strip()
173
+ 'Some documentation for Inner2'
174
+ sage: sage_getsourcelines(c)
175
+ (['class Inner2(BindableClass):...], ...)
176
+
177
+ .. warning::
178
+
179
+ Since ``c`` is not a class (as tested by :func:`inspect.isclass`),
180
+ and has a ``__call__`` method, IPython's introspection
181
+ (with ``c?``) insists on showing not only its
182
+ documentation but also its class documentation and call
183
+ documentation (see :meth:`IPython.OInspect.Inspector.pdoc`)
184
+ if available.
185
+
186
+ Until a better approach is found, we reset the documentation
187
+ of :class:`BoundClass` below, and make an exception for
188
+ :meth:`__init__` to the strict rule that every method should
189
+ be doctested::
190
+
191
+ sage: c.__class__.__doc__
192
+ sage: c.__class__.__init__.__doc__
193
+
194
+ Make sure classes which inherit from :class:`functools.partial` have the correct
195
+ syntax, see :issue:`14748`::
196
+
197
+ sage: import warnings
198
+ sage: warnings.simplefilter('error', DeprecationWarning)
199
+ sage: import functools
200
+ sage: def f(x, y): return x^y
201
+ sage: g = functools.partial(f, 2, 3)
202
+ sage: g()
203
+ 8
204
+
205
+ The following has correct syntax and no :class:`DeprecationWarning`::
206
+
207
+ sage: class mynewpartial(functools.partial):
208
+ ....: def __init__(self, f, i, j):
209
+ ....: functools.partial.__init__(self)
210
+ sage: g = mynewpartial(f, 2, 3)
211
+ sage: g()
212
+ 8
213
+ """
214
+ __doc__ = None # See warning above
215
+
216
+ def __init__(self, *args):
217
+ super().__init__()
218
+ self.__doc__ = self.func.__doc__
219
+
220
+ def __repr__(self):
221
+ """
222
+ TESTS:
223
+
224
+ sage: from sage.misc.bindable_class import Outer
225
+ sage: x = Outer(); x
226
+ <sage.misc.bindable_class.Outer object at ...>
227
+ sage: x.Inner
228
+ <bound class 'sage.misc.bindable_class.Outer.Inner' of <sage.misc.bindable_class.Outer object at ...>>
229
+ """
230
+ return "<bound %s of %s>" % (repr(self.func)[1:-1], self.args[0])
231
+
232
+
233
+ ##############################################################################
234
+ # Test classes
235
+ ##############################################################################
236
+
237
+ class Inner2(BindableClass):
238
+ """
239
+ Some documentation for Inner2
240
+ """
241
+
242
+
243
+ # We need NestedClassMetaclass to work around a Python pickling bug
244
+ class Outer(metaclass=NestedClassMetaclass):
245
+ """
246
+ A class with a bindable nested class, for testing purposes
247
+ """
248
+ class Inner(BindableClass):
249
+ """
250
+ Some documentation for Outer.Inner
251
+ """
252
+
253
+ Inner2 = Inner2
@@ -0,0 +1,2 @@
1
+ # sage_setup: distribution = sagemath-objects
2
+ cpdef tuple C3_sorted_merge(list lists, key=?)