Skip to content

Commit 8a0b16d

Browse files
author
Release Manager
committedJan 2, 2023
Trac #34804: Deprecate sage.interfaces is_...Element functions
Introducing a module `sage.interfaces.abc` with abstract base classes for `isinstance` testing (see https://doc.sagemath.org/html/en/developer/packaging_sage_library.html #module-level-runtime-dependencies) Part of #32414 URL: https://trac.sagemath.org/34804 Reported by: mkoeppe Ticket author(s): Matthias Koeppe, Dima Pasechnik Reviewer(s): Dima Pasechnik
2 parents 80f8f95 + b9eac04 commit 8a0b16d

29 files changed

+346
-84
lines changed
 

‎src/doc/en/reference/interfaces/index.rst

+1
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ and testing to make sure nothing funny is going on).
6363
sage/interfaces/interface
6464
sage/interfaces/expect
6565
sage/interfaces/sagespawn
66+
sage/interfaces/abc
6667
sage/interfaces/axiom
6768
sage/interfaces/ecm
6869
sage/interfaces/four_ti_2

‎src/sage/algebras/commutative_dga.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,8 @@
100100
from sage.rings.quotient_ring_element import QuotientRingElement
101101
from sage.misc.cachefunc import cached_function
102102

103+
import sage.interfaces.abc
104+
103105

104106
def sorting_keys(element):
105107
r"""
@@ -1262,8 +1264,7 @@ def _element_constructor_(self, x, coerce=True):
12621264
R = self.cover_ring()
12631265
x = R(x)
12641266

1265-
from sage.interfaces.singular import is_SingularElement
1266-
if is_SingularElement(x):
1267+
if isinstance(x, sage.interfaces.abc.SingularElement):
12671268
# self._singular_().set_ring()
12681269
x = self.element_class(self, x.sage_poly(self.cover_ring()))
12691270
return x

‎src/sage/groups/perm_gps/permgroup.py

+2-3
Original file line numberDiff line numberDiff line change
@@ -142,8 +142,7 @@
142142
from sage.groups.group import FiniteGroup
143143

144144
from sage.rings.all import QQ, Integer
145-
from sage.interfaces.expect import is_ExpectElement
146-
from sage.interfaces.gap import GapElement
145+
from sage.interfaces.abc import ExpectElement, GapElement
147146
from sage.libs.gap.libgap import libgap
148147
from sage.libs.gap.element import GapElement as LibGapElement
149148
from sage.groups.perm_gps.permgroup_element import PermutationGroupElement
@@ -385,7 +384,7 @@ def PermutationGroup(gens=None, *args, **kwds):
385384
See https://trac.sagemath.org/31510 for details.
386385
387386
"""
388-
if not is_ExpectElement(gens) and hasattr(gens, '_permgroup_'):
387+
if not isinstance(gens, ExpectElement) and hasattr(gens, '_permgroup_'):
389388
return gens._permgroup_()
390389
if gens is not None and not isinstance(gens, (tuple, list, GapElement)):
391390
raise TypeError("gens must be a tuple, list, or GapElement")

‎src/sage/groups/perm_gps/permgroup_element.pyx

+4-3
Original file line numberDiff line numberDiff line change
@@ -122,8 +122,9 @@ from sage.sets.finite_enumerated_set import FiniteEnumeratedSet
122122
import sage.structure.coerce as coerce
123123
from sage.structure.richcmp cimport richcmp_not_equal, rich_to_bool
124124
from sage.structure.coerce cimport coercion_model
125-
from sage.interfaces.gap import GapElement as PExpectGapElement
126-
from sage.interfaces.gp import GpElement
125+
from sage.interfaces.abc import GpElement
126+
127+
import sage.interfaces.abc
127128

128129
from sage.libs.gap.libgap import libgap
129130
from sage.libs.gap.gap_includes cimport (UInt, UInt2, UInt4, T_PERM2, T_PERM4,
@@ -478,7 +479,7 @@ cdef class PermutationGroupElement(MultiplicativeGroupElement):
478479
self._set_list_images(g.sage(), convert)
479480
else:
480481
raise ValueError("invalid data to initialize a permutation")
481-
elif isinstance(g, PExpectGapElement):
482+
elif isinstance(g, sage.interfaces.abc.GapElement):
482483
if g.IsPerm():
483484
self._set_list_images(g.ListPerm(), False)
484485
else:

‎src/sage/interfaces/abc.py

+135
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,138 @@
1+
r"""
2+
Abstract base classes for interface elements
3+
"""
4+
5+
class AxiomElement:
6+
r"""
7+
Abstract base class for :class:`~sage.interfaces.axiom.AxiomElement`.
8+
9+
This class is defined for the purpose of ``isinstance`` tests. It should not be
10+
instantiated.
11+
12+
EXAMPLES:
13+
14+
By design, there is a unique direct subclass::
15+
16+
sage: len(sage.interfaces.abc.AxiomElement.__subclasses__()) <= 1
17+
True
18+
"""
19+
pass
20+
21+
22+
class ExpectElement:
23+
r"""
24+
Abstract base class for :class:`~sage.interfaces.expect.ExpectElement`.
25+
26+
This class is defined for the purpose of ``isinstance`` tests. It should not be
27+
instantiated.
28+
29+
EXAMPLES:
30+
31+
By design, there is a unique direct subclass::
32+
33+
sage: len(sage.interfaces.abc.ExpectElement.__subclasses__()) <= 1
34+
True
35+
"""
36+
pass
37+
38+
39+
class FriCASElement:
40+
r"""
41+
Abstract base class for :class:`~sage.interfaces.fricas.FriCASElement`.
42+
43+
This class is defined for the purpose of ``isinstance`` tests. It should not be
44+
instantiated.
45+
46+
EXAMPLES:
47+
48+
By design, there is a unique direct subclass::
49+
50+
sage: len(sage.interfaces.abc.FriCASElement.__subclasses__()) <= 1
51+
True
52+
"""
53+
pass
54+
55+
156
class GapElement:
57+
r"""
58+
Abstract base class for :class:`~sage.interfaces.gap.GapElement`.
59+
60+
This class is defined for the purpose of ``isinstance`` tests. It should not be
61+
instantiated.
62+
63+
EXAMPLES:
64+
65+
By design, there is a unique direct subclass::
66+
67+
sage: len(sage.interfaces.abc.GapElement.__subclasses__()) <= 1
68+
True
69+
"""
70+
pass
71+
72+
73+
class GpElement:
74+
r"""
75+
Abstract base class for :class:`~sage.interfaces.gp.GpElement`.
76+
77+
This class is defined for the purpose of ``isinstance`` tests. It should not be
78+
instantiated.
79+
80+
EXAMPLES:
81+
82+
By design, there is a unique direct subclass::
83+
84+
sage: len(sage.interfaces.abc.GpElement.__subclasses__()) <= 1
85+
True
86+
"""
87+
pass
88+
89+
90+
class Macaulay2Element:
91+
r"""
92+
Abstract base class for :class:`~sage.interfaces.macaulay2.Macaulay2Element`.
93+
94+
This class is defined for the purpose of ``isinstance`` tests. It should not be
95+
instantiated.
96+
97+
EXAMPLES:
98+
99+
By design, there is a unique direct subclass::
100+
101+
sage: len(sage.interfaces.abc.Macaulay2Element.__subclasses__()) <= 1
102+
True
103+
"""
104+
pass
105+
106+
107+
class MagmaElement:
108+
r"""
109+
Abstract base class for :class:`~sage.interfaces.magma.MagmaElement`.
110+
111+
This class is defined for the purpose of ``isinstance`` tests. It should not be
112+
instantiated.
113+
114+
EXAMPLES:
115+
116+
By design, there is a unique direct subclass::
117+
118+
sage: len(sage.interfaces.abc.MagmaElement.__subclasses__()) <= 1
119+
True
120+
"""
121+
pass
122+
123+
124+
class SingularElement:
125+
r"""
126+
Abstract base class for :class:`~sage.interfaces.singular.SingularElement`.
127+
128+
This class is defined for the purpose of ``isinstance`` tests. It should not be
129+
instantiated.
130+
131+
EXAMPLES:
132+
133+
By design, there is a unique direct subclass::
2134
135+
sage: len(sage.interfaces.abc.SingularElement.__subclasses__()) <= 1
136+
True
137+
"""
3138
pass

‎src/sage/interfaces/axiom.py

+12-4
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,8 @@
179179
import os
180180
import re
181181

182+
import sage.interfaces.abc
183+
182184
from .expect import Expect, ExpectElement, FunctionElement, ExpectFunction
183185
from sage.env import DOT_SAGE
184186
from pexpect import EOF
@@ -555,7 +557,7 @@ def console(self):
555557

556558

557559
@instancedoc
558-
class PanAxiomElement(ExpectElement):
560+
class PanAxiomElement(ExpectElement, sage.interfaces.abc.AxiomElement):
559561
def __call__(self, x):
560562
"""
561563
EXAMPLES::
@@ -944,18 +946,24 @@ def __init__(self, parent, name):
944946

945947
def is_AxiomElement(x):
946948
"""
947-
Returns True of x is of type AxiomElement.
949+
Return True if ``x`` is of type :class:`AxiomElement`.
948950
949951
EXAMPLES::
950952
951953
sage: from sage.interfaces.axiom import is_AxiomElement
952-
sage: is_AxiomElement(axiom(2)) #optional - axiom
953-
True
954954
sage: is_AxiomElement(2)
955+
doctest:...: DeprecationWarning: the function is_AxiomElement is deprecated; use isinstance(x, sage.interfaces.abc.AxiomElement) instead
956+
See https://trac.sagemath.org/34804 for details.
955957
False
958+
sage: is_AxiomElement(axiom(2)) # optional - axiom
959+
True
956960
"""
961+
from sage.misc.superseded import deprecation
962+
deprecation(34804, "the function is_AxiomElement is deprecated; use isinstance(x, sage.interfaces.abc.AxiomElement) instead")
963+
957964
return isinstance(x, AxiomElement)
958965

966+
959967
#Instances
960968
axiom = Axiom(name='axiom')
961969

‎src/sage/interfaces/expect.py

+19-1
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252

5353
import pexpect
5454
from pexpect import ExceptionPexpect
55+
import sage.interfaces.abc
5556
from sage.interfaces.sagespawn import SageSpawn
5657
from sage.interfaces.interface import (Interface, InterfaceElement,
5758
InterfaceFunction, InterfaceFunctionElement)
@@ -1465,11 +1466,28 @@ class FunctionElement(InterfaceFunctionElement):
14651466

14661467

14671468
def is_ExpectElement(x):
1469+
"""
1470+
Return True if ``x`` is of type :class:`ExpectElement`
1471+
1472+
This function is deprecated; use :func:`isinstance`
1473+
(of :class:`sage.interfaces.abc.ExpectElement`) instead.
1474+
1475+
EXAMPLES::
1476+
1477+
sage: from sage.interfaces.expect import is_ExpectElement
1478+
sage: is_ExpectElement(2)
1479+
doctest:...: DeprecationWarning: the function is_ExpectElement is deprecated; use isinstance(x, sage.interfaces.abc.ExpectElement) instead
1480+
See https://trac.sagemath.org/34804 for details.
1481+
False
1482+
"""
1483+
from sage.misc.superseded import deprecation
1484+
deprecation(34804, "the function is_ExpectElement is deprecated; use isinstance(x, sage.interfaces.abc.ExpectElement) instead")
1485+
14681486
return isinstance(x, ExpectElement)
14691487

14701488

14711489
@instancedoc
1472-
class ExpectElement(InterfaceElement):
1490+
class ExpectElement(InterfaceElement, sage.interfaces.abc.ExpectElement):
14731491
"""
14741492
Expect element.
14751493
"""

‎src/sage/interfaces/fricas.py

+13-6
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,9 @@
198198

199199
import re
200200
import os
201+
202+
import sage.interfaces.abc
203+
201204
from sage.interfaces.tab_completion import ExtraTabCompletion
202205
from sage.interfaces.expect import Expect, ExpectElement, FunctionElement, ExpectFunction
203206
from sage.env import DOT_SAGE, LOCAL_IDENTIFIER
@@ -995,7 +998,7 @@ def console(self):
995998

996999

9971000
@instancedoc
998-
class FriCASElement(ExpectElement):
1001+
class FriCASElement(ExpectElement, sage.interfaces.abc.FriCASElement):
9991002
"""
10001003
Instances of this class represent objects in FriCAS.
10011004
@@ -2106,12 +2109,17 @@ def is_FriCASElement(x):
21062109
21072110
EXAMPLES::
21082111
2109-
sage: from sage.interfaces.fricas import is_FriCASElement # optional - fricas
2112+
sage: from sage.interfaces.fricas import is_FriCASElement
2113+
sage: is_FriCASElement(2)
2114+
doctest:...: DeprecationWarning: the function is_FriCASElement is deprecated; use isinstance(x, sage.interfaces.abc.FriCASElement) instead
2115+
See https://trac.sagemath.org/34804 for details.
2116+
False
21102117
sage: is_FriCASElement(fricas(2)) # optional - fricas
21112118
True
2112-
sage: is_FriCASElement(2) # optional - fricas
2113-
False
21142119
"""
2120+
from sage.misc.superseded import deprecation
2121+
deprecation(34804, "the function is_FriCASElement is deprecated; use isinstance(x, sage.interfaces.abc.FriCASElement) instead")
2122+
21152123
return isinstance(x, FriCASElement)
21162124

21172125

@@ -2120,8 +2128,7 @@ def is_FriCASElement(x):
21202128

21212129
def reduce_load_fricas():
21222130
"""
2123-
Return the FriCAS interface object defined in
2124-
:sage.interfaces.fricas.
2131+
Return the FriCAS interface object defined in :mod:`sage.interfaces.fricas`.
21252132
21262133
EXAMPLES::
21272134

‎src/sage/interfaces/gp.py

+11-2
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,7 @@
147147
from sage.libs.pari.all import pari
148148
import sage.rings.complex_mpfr
149149
from sage.misc.instancedoc import instancedoc
150+
import sage.interfaces.abc
150151

151152

152153
class Gp(ExtraTabCompletion, Expect):
@@ -821,7 +822,7 @@ def new_with_bits_prec(self, s, precision=0):
821822

822823

823824
@instancedoc
824-
class GpElement(ExpectElement):
825+
class GpElement(ExpectElement, sage.interfaces.abc.GpElement):
825826
"""
826827
EXAMPLES: This example illustrates dumping and loading GP elements
827828
to compressed strings.
@@ -1036,16 +1037,24 @@ def _tab_completion(self):
10361037

10371038
def is_GpElement(x):
10381039
"""
1039-
Returns True of x is a GpElement.
1040+
Return True if ``x`` is of type :class:`GpElement`
1041+
1042+
This function is deprecated; use :func:`isinstance`
1043+
(of :class:`sage.interfaces.abc.GpElement`) instead.
10401044
10411045
EXAMPLES::
10421046
10431047
sage: from sage.interfaces.gp import is_GpElement
10441048
sage: is_GpElement(gp(2))
1049+
doctest:...: DeprecationWarning: the function is_GpElement is deprecated; use isinstance(x, sage.interfaces.abc.GpElement) instead
1050+
See https://trac.sagemath.org/34804 for details.
10451051
True
10461052
sage: is_GpElement(2)
10471053
False
10481054
"""
1055+
from sage.misc.superseded import deprecation
1056+
deprecation(34804, "the function is_GpElement is deprecated; use isinstance(x, sage.interfaces.abc.GpElement) instead")
1057+
10491058
return isinstance(x, GpElement)
10501059

10511060

‎src/sage/interfaces/interface.py

+14
Original file line numberDiff line numberDiff line change
@@ -711,6 +711,20 @@ def _instancedoc_(self):
711711

712712

713713
def is_InterfaceElement(x):
714+
"""
715+
Return True if ``x`` is of type :class:`InterfaceElement`.
716+
717+
EXAMPLES::
718+
719+
sage: from sage.interfaces.interface import is_InterfaceElement
720+
sage: is_InterfaceElement(2)
721+
doctest:...: DeprecationWarning: the function is_InterfaceElement is deprecated; use isinstance(x, sage.interfaces.abc.InterfaceElement) instead
722+
See https://trac.sagemath.org/34804 for details.
723+
False
724+
"""
725+
from sage.misc.superseded import deprecation
726+
deprecation(34804, "the function is_InterfaceElement is deprecated; use isinstance(x, sage.interfaces.abc.InterfaceElement) instead")
727+
714728
return isinstance(x, InterfaceElement)
715729

716730

‎src/sage/interfaces/kash.py

+16
Original file line numberDiff line numberDiff line change
@@ -784,6 +784,22 @@ def __repr__(self):
784784

785785

786786
def is_KashElement(x):
787+
"""
788+
Returns True if ``x`` is of type :class:`KashElement`.
789+
790+
EXAMPLES::
791+
792+
sage: from sage.interfaces.kash import is_KashElement
793+
sage: is_KashElement(2)
794+
doctest:...: DeprecationWarning: the function is_KashElement is deprecated; use isinstance(x, sage.interfaces.abc.KashElement) instead
795+
See https://trac.sagemath.org/34804 for details.
796+
False
797+
sage: is_KashElement(kash(2)) # optional - kash
798+
True
799+
"""
800+
from sage.misc.superseded import deprecation
801+
deprecation(34804, "the function is_KashElement is deprecated; use isinstance(x, sage.interfaces.abc.KashElement) instead")
802+
787803
return isinstance(x, KashElement)
788804

789805
######

‎src/sage/interfaces/lie.py

+7-2
Original file line numberDiff line numberDiff line change
@@ -889,12 +889,17 @@ def is_LiEElement(x) -> bool:
889889
EXAMPLES::
890890
891891
sage: from sage.interfaces.lie import is_LiEElement
892+
sage: is_LiEElement(2)
893+
doctest:...: DeprecationWarning: the function is_LiEElement is deprecated; use isinstance(x, sage.interfaces.abc.LiEElement) instead
894+
See https://trac.sagemath.org/34804 for details.
895+
False
892896
sage: l = lie(2) # optional - lie
893897
sage: is_LiEElement(l) # optional - lie
894898
True
895-
sage: is_LiEElement(2)
896-
False
897899
"""
900+
from sage.misc.superseded import deprecation
901+
deprecation(34804, "the function is_LiEElement is deprecated; use isinstance(x, sage.interfaces.abc.LiEElement) instead")
902+
898903
return isinstance(x, LiEElement)
899904

900905

‎src/sage/interfaces/lisp.py

+7-2
Original file line numberDiff line numberDiff line change
@@ -525,11 +525,16 @@ def is_LispElement(x):
525525
EXAMPLES::
526526
527527
sage: from sage.interfaces.lisp import is_LispElement
528-
sage: is_LispElement(lisp(2))
529-
True
530528
sage: is_LispElement(2)
529+
doctest:...: DeprecationWarning: the function is_LispElement is deprecated; use isinstance(x, sage.interfaces.abc.LispElement) instead
530+
See https://trac.sagemath.org/34804 for details.
531531
False
532+
sage: is_LispElement(lisp(2))
533+
True
532534
"""
535+
from sage.misc.superseded import deprecation
536+
deprecation(34804, "the function is_LispElement is deprecated; use isinstance(x, sage.interfaces.abc.LispElement) instead")
537+
533538
return isinstance(x, LispElement)
534539

535540
# An instance

‎src/sage/interfaces/macaulay2.py

+13-1
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,8 @@
120120
import os
121121
import re
122122

123+
import sage.interfaces.abc
124+
123125
from sage.interfaces.expect import (Expect, ExpectElement, ExpectFunction,
124126
FunctionElement)
125127
from sage.interfaces.interface import AsciiArtString
@@ -867,7 +869,7 @@ def _macaulay2_input_ring(self, base_ring, vars, order='GRevLex'):
867869

868870

869871
@instancedoc
870-
class Macaulay2Element(ExtraTabCompletion, ExpectElement):
872+
class Macaulay2Element(ExtraTabCompletion, ExpectElement, sage.interfaces.abc.Macaulay2Element):
871873
"""
872874
Instances of this class represent objects in Macaulay2.
873875
@@ -1832,14 +1834,24 @@ def _sage_src_(self):
18321834

18331835
def is_Macaulay2Element(x):
18341836
"""
1837+
Return True if ``x`` is a :class:`Macaulay2Element`
1838+
1839+
This function is deprecated; use :func:`isinstance`
1840+
(of :class:`sage.interfaces.abc.Macaulay2Element`) instead.
1841+
18351842
EXAMPLES::
18361843
18371844
sage: from sage.interfaces.macaulay2 import is_Macaulay2Element
18381845
sage: is_Macaulay2Element(2) # optional - macaulay2
1846+
doctest:...: DeprecationWarning: the function is_Macaulay2Element is deprecated; use isinstance(x, sage.interfaces.abc.MacaulayElement) instead
1847+
See https://trac.sagemath.org/34823 for details.
18391848
False
18401849
sage: is_Macaulay2Element(macaulay2(2)) # optional - macaulay2
18411850
True
18421851
"""
1852+
from sage.misc.superseded import deprecation
1853+
deprecation(34804, "the function is_Macaulay2Element is deprecated; use isinstance(x, sage.interfaces.abc.Macaulay2Element) instead")
1854+
18431855
return isinstance(x, Macaulay2Element)
18441856

18451857
# An instance

‎src/sage/interfaces/magma.py

+8-4
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,7 @@
225225
from sage.env import SAGE_EXTCODE, DOT_SAGE
226226
import sage.misc.misc
227227
import sage.misc.sage_eval
228+
import sage.interfaces.abc
228229
from sage.interfaces.tab_completion import ExtraTabCompletion
229230
from sage.misc.instancedoc import instancedoc
230231

@@ -1813,29 +1814,32 @@ def _instancedoc_(self):
18131814

18141815
def is_MagmaElement(x):
18151816
"""
1816-
Return True if x is of type MagmaElement, and False otherwise.
1817+
Return True if ``x`` is of type :class:`MagmaElement`, and False otherwise.
18171818
18181819
INPUT:
18191820
1820-
18211821
- ``x`` - any object
18221822
1823-
18241823
OUTPUT: bool
18251824
18261825
EXAMPLES::
18271826
18281827
sage: from sage.interfaces.magma import is_MagmaElement
18291828
sage: is_MagmaElement(2)
1829+
doctest:...: DeprecationWarning: the function is_MagmaElement is deprecated; use isinstance(x, sage.interfaces.abc.MagmaElement) instead
1830+
See https://trac.sagemath.org/34804 for details.
18301831
False
18311832
sage: is_MagmaElement(magma(2)) # optional - magma
18321833
True
18331834
"""
1835+
from sage.misc.superseded import deprecation
1836+
deprecation(34804, "the function is_MagmaElement is deprecated; use isinstance(x, sage.interfaces.abc.MagmaElement) instead")
1837+
18341838
return isinstance(x, MagmaElement)
18351839

18361840

18371841
@instancedoc
1838-
class MagmaElement(ExtraTabCompletion, ExpectElement):
1842+
class MagmaElement(ExtraTabCompletion, ExpectElement, sage.interfaces.abc.MagmaElement):
18391843
def _ref(self):
18401844
"""
18411845
Return a variable name that is a new reference to this particular

‎src/sage/interfaces/maxima.py

+8-3
Original file line numberDiff line numberDiff line change
@@ -1125,17 +1125,22 @@ def _object_function_class(self):
11251125

11261126
def is_MaximaElement(x):
11271127
"""
1128-
Returns True if x is of type MaximaElement.
1128+
Returns True if ``x`` is of type :class:`MaximaElement`.
11291129
11301130
EXAMPLES::
11311131
11321132
sage: from sage.interfaces.maxima import is_MaximaElement
1133+
sage: is_MaximaElement(1)
1134+
doctest:...: DeprecationWarning: the function is_MaximaElement is deprecated; use isinstance(x, sage.interfaces.abc.MaximaElement) instead
1135+
See https://trac.sagemath.org/34804 for details.
1136+
False
11331137
sage: m = maxima(1)
11341138
sage: is_MaximaElement(m)
11351139
True
1136-
sage: is_MaximaElement(1)
1137-
False
11381140
"""
1141+
from sage.misc.superseded import deprecation
1142+
deprecation(34804, "the function is_MaximaElement is deprecated; use isinstance(x, sage.interfaces.abc.MaximaElement) instead")
1143+
11391144
return isinstance(x, MaximaElement)
11401145

11411146

‎src/sage/interfaces/maxima_lib.py

+8-3
Original file line numberDiff line numberDiff line change
@@ -1009,17 +1009,22 @@ def _missing_assumption(self,errstr):
10091009

10101010
def is_MaximaLibElement(x):
10111011
r"""
1012-
Returns True if x is of type MaximaLibElement.
1012+
Return True if ``x`` is of type :class:`MaximaLibElement`.
10131013
10141014
EXAMPLES::
10151015
10161016
sage: from sage.interfaces.maxima_lib import maxima_lib, is_MaximaLibElement
1017+
sage: is_MaximaLibElement(1)
1018+
doctest:...: DeprecationWarning: the function is_MaximaLibElement is deprecated; use isinstance(x, sage.interfaces.abc.MaximaLibElement) instead
1019+
See https://trac.sagemath.org/34804 for details.
1020+
False
10171021
sage: m = maxima_lib(1)
10181022
sage: is_MaximaLibElement(m)
10191023
True
1020-
sage: is_MaximaLibElement(1)
1021-
False
10221024
"""
1025+
from sage.misc.superseded import deprecation
1026+
deprecation(34804, "the function is_MaximaLibElement is deprecated; use isinstance(x, sage.interfaces.abc.MaximaLibElement) instead")
1027+
10231028
return isinstance(x, MaximaLibElement)
10241029

10251030

‎src/sage/interfaces/r.py

+5
Original file line numberDiff line numberDiff line change
@@ -2001,10 +2001,15 @@ def is_RElement(x):
20012001
20022002
sage: from sage.interfaces.r import is_RElement # optional - rpy2
20032003
sage: is_RElement(2) # optional - rpy2
2004+
doctest:...: DeprecationWarning: the function is_RElement is deprecated; use isinstance(x, sage.interfaces.abc.RElement) instead
2005+
See https://trac.sagemath.org/34804 for details.
20042006
False
20052007
sage: is_RElement(r(2)) # optional - rpy2
20062008
True
20072009
"""
2010+
from sage.misc.superseded import deprecation
2011+
deprecation(34804, "the function is_RElement is deprecated; use isinstance(x, sage.interfaces.abc.RElement) instead")
2012+
20082013
return isinstance(x, RElement)
20092014

20102015
# An instance of R

‎src/sage/interfaces/singular.py

+12-2
Original file line numberDiff line numberDiff line change
@@ -345,6 +345,8 @@
345345

346346
from .expect import Expect, ExpectElement, FunctionElement, ExpectFunction
347347

348+
import sage.interfaces.abc
349+
348350
from sage.interfaces.tab_completion import ExtraTabCompletion
349351
from sage.structure.sequence import Sequence_generic
350352
from sage.structure.element import RingElement
@@ -1355,7 +1357,7 @@ def _keyboard_interrupt(self):
13551357

13561358

13571359
@instancedoc
1358-
class SingularElement(ExtraTabCompletion, ExpectElement):
1360+
class SingularElement(ExtraTabCompletion, ExpectElement, sage.interfaces.abc.SingularElement):
13591361

13601362
def __init__(self, parent, type, value, is_name=False):
13611363
"""
@@ -2331,16 +2333,24 @@ def _instancedoc_(self):
23312333

23322334
def is_SingularElement(x):
23332335
r"""
2334-
Returns True is x is of type ``SingularElement``.
2336+
Return True is ``x`` is of type :class:`SingularElement`.
2337+
2338+
This function is deprecated; use :func:`isinstance`
2339+
(of :class:`sage.interfaces.abc.SingularElement`) instead.
23352340
23362341
EXAMPLES::
23372342
23382343
sage: from sage.interfaces.singular import is_SingularElement
23392344
sage: is_SingularElement(singular(2))
2345+
doctest:...: DeprecationWarning: the function is_SingularElement is deprecated; use isinstance(x, sage.interfaces.abc.SingularElement) instead
2346+
See https://trac.sagemath.org/34804 for details.
23402347
True
23412348
sage: is_SingularElement(2)
23422349
False
23432350
"""
2351+
from sage.misc.superseded import deprecation
2352+
deprecation(34804, "the function is_SingularElement is deprecated; use isinstance(x, sage.interfaces.abc.SingularElement) instead")
2353+
23442354
return isinstance(x, SingularElement)
23452355

23462356

‎src/sage/rings/padics/padic_ZZ_pX_CA_element.pyx

+1-1
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ from sage.libs.ntl.ntl_ZZ_pContext cimport ntl_ZZ_pContext_class
178178
from sage.libs.ntl.ntl_ZZ_pContext import ntl_ZZ_pContext
179179
from sage.rings.padics.padic_generic_element cimport pAdicGenericElement
180180
from sage.libs.pari.all import pari_gen
181-
from sage.interfaces.gp import GpElement
181+
from sage.interfaces.abc import GpElement
182182
from sage.rings.finite_rings.integer_mod import is_IntegerMod
183183
from sage.rings.finite_rings.integer_mod_ring import IntegerModRing
184184
from sage.rings.padics.padic_ext_element cimport pAdicExtElement

‎src/sage/rings/padics/padic_ZZ_pX_CR_element.pyx

+1-1
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,7 @@ from sage.libs.ntl.ntl_ZZ_pContext cimport ntl_ZZ_pContext_class
204204
from sage.libs.ntl.ntl_ZZ_pContext import ntl_ZZ_pContext
205205
from sage.rings.padics.padic_generic_element cimport pAdicGenericElement
206206
from sage.libs.pari.all import pari_gen
207-
from sage.interfaces.gp import GpElement
207+
from sage.interfaces.abc import GpElement
208208
from sage.rings.finite_rings.integer_mod import is_IntegerMod
209209
from sage.rings.padics.padic_ext_element cimport pAdicExtElement
210210
from sage.rings.padics.precision_error import PrecisionError

‎src/sage/rings/padics/padic_ZZ_pX_FM_element.pyx

+1-1
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ from sage.libs.ntl.ntl_ZZ_pContext cimport ntl_ZZ_pContext_class
147147
from sage.libs.ntl.ntl_ZZ_pContext import ntl_ZZ_pContext
148148
from sage.rings.rational cimport Rational
149149
from sage.libs.pari.all import pari_gen
150-
from sage.interfaces.gp import GpElement
150+
from sage.interfaces.abc import GpElement
151151
from sage.rings.finite_rings.integer_mod import is_IntegerMod
152152
from sage.rings.finite_rings.integer_mod_ring import IntegerModRing
153153
from sage.rings.padics.pow_computer_ext cimport PowComputer_ZZ_pX_FM_Eis

‎src/sage/rings/polynomial/multi_polynomial_libsingular.pyx

+24-17
Original file line numberDiff line numberDiff line change
@@ -249,8 +249,7 @@ from sage.structure.sequence import Sequence
249249
from sage.rings.fraction_field import FractionField
250250
from sage.rings.all import RealField
251251

252-
from sage.interfaces.singular import singular as singular_default, is_SingularElement, SingularElement
253-
from sage.interfaces.macaulay2 import macaulay2 as macaulay2_default, is_Macaulay2Element
252+
import sage.interfaces.abc
254253

255254
from sage.misc.misc_c import prod as mul
256255
from sage.misc.sage_eval import sage_eval
@@ -969,9 +968,9 @@ cdef class MPolynomialRing_libsingular(MPolynomialRing_base):
969968
gens_map = dict(zip(Q.variable_names(),self.gens()[:Q.ngens()]))
970969
return eval(str(element),gens_map)
971970

972-
if isinstance(element, (SingularElement, cypari2.gen.Gen)):
971+
if isinstance(element, (sage.interfaces.abc.SingularElement, cypari2.gen.Gen)):
973972
element = str(element)
974-
elif is_Macaulay2Element(element):
973+
elif isinstance(element, sage.interfaces.abc.Macaulay2Element):
975974
element = element.external_string()
976975

977976
if isinstance(element, str):
@@ -1106,10 +1105,7 @@ cdef class MPolynomialRing_libsingular(MPolynomialRing_base):
11061105
if gens.ring() is self:
11071106
return gens
11081107
gens = gens.gens()
1109-
if is_SingularElement(gens):
1110-
gens = list(gens)
1111-
coerce = True
1112-
elif is_Macaulay2Element(gens):
1108+
if isinstance(gens, (sage.interfaces.abc.SingularElement, sage.interfaces.abc.Macaulay2Element)):
11131109
gens = list(gens)
11141110
coerce = True
11151111
if not isinstance(gens, (list, tuple)):
@@ -1118,7 +1114,7 @@ cdef class MPolynomialRing_libsingular(MPolynomialRing_base):
11181114
gens = [self(x) for x in gens] # this will even coerce from singular ideals correctly!
11191115
return MPolynomialIdeal(self, gens, coerce=False)
11201116

1121-
def _macaulay2_(self, macaulay2=macaulay2_default):
1117+
def _macaulay2_(self, macaulay2=None):
11221118
"""
11231119
Create an M2 representation of this polynomial ring if
11241120
Macaulay2 is installed.
@@ -1147,6 +1143,8 @@ cdef class MPolynomialRing_libsingular(MPolynomialRing_base):
11471143
--[x...y]
11481144
17
11491145
"""
1146+
if macaulay2 is None:
1147+
from sage.interfaces.macaulay2 import macaulay2
11501148
try:
11511149
R = self.__macaulay2
11521150
if R is None or not (R.parent() is macaulay2):
@@ -1165,18 +1163,18 @@ cdef class MPolynomialRing_libsingular(MPolynomialRing_base):
11651163
'sage...[symbol x0,symbol x1, MonomialSize=>16, MonomialOrder=>GLex]'
11661164
"""
11671165
if macaulay2 is None:
1168-
macaulay2 = macaulay2_default
1166+
from sage.interfaces.macaulay2 import macaulay2
11691167
return macaulay2._macaulay2_input_ring(self.base_ring(), self.gens(),
11701168
self.term_order().macaulay2_str())
11711169

1172-
def _singular_(self, singular=singular_default):
1170+
def _singular_(self, singular=None):
11731171
"""
11741172
Create a SINGULAR (as in the computer algebra system)
11751173
representation of this polynomial ring. The result is cached.
11761174
11771175
INPUT:
11781176
1179-
- ``singular`` - SINGULAR interpreter (default: ``singular_default``)
1177+
- ``singular`` - SINGULAR interpreter (default: ``sage.interfaces.singular.singular``)
11801178
11811179
EXAMPLES::
11821180
@@ -1222,6 +1220,8 @@ cdef class MPolynomialRing_libsingular(MPolynomialRing_base):
12221220
// : names x
12231221
// block 2 : ordering C
12241222
"""
1223+
if singular is None:
1224+
from sage.interfaces.singular import singular
12251225
try:
12261226
R = self.__singular
12271227
if R is None or not (R.parent() is singular):
@@ -1241,15 +1241,15 @@ cdef class MPolynomialRing_libsingular(MPolynomialRing_base):
12411241
except (AttributeError, ValueError):
12421242
return self._singular_init_(singular)
12431243

1244-
def _singular_init_(self, singular=singular_default):
1244+
def _singular_init_(self, singular=None):
12451245
"""
12461246
Create a SINGULAR (as in the computer algebra system)
12471247
representation of this polynomial ring. The result is NOT
12481248
cached.
12491249
12501250
INPUT:
12511251
1252-
- ``singular`` - SINGULAR interpreter (default: ``singular_default``)
1252+
- ``singular`` - SINGULAR interpreter (default: ``sage.interfaces.singular.singular``)
12531253
12541254
EXAMPLES::
12551255
@@ -1375,6 +1375,9 @@ cdef class MPolynomialRing_libsingular(MPolynomialRing_base):
13751375
"""
13761376
from sage.functions.other import ceil
13771377

1378+
if singular is None:
1379+
from sage.interfaces.singular import singular
1380+
13781381
if self.ngens()==1:
13791382
_vars = str(self.gen())
13801383
if "*" in _vars: # 1.000...000*x
@@ -5001,14 +5004,14 @@ cdef class MPolynomial_libsingular(MPolynomial):
50015004
sig_off()
50025005
return new_MP(parent, quo), new_MP(parent, rem)
50035006

5004-
def _singular_init_(self, singular=singular_default):
5007+
def _singular_init_(self, singular=None):
50055008
"""
50065009
Return a SINGULAR (as in the computer algebra system) string
50075010
representation for this element.
50085011
50095012
INPUT:
50105013
5011-
- ``singular`` - interpreter (default: ``singular_default``)
5014+
- ``singular`` - interpreter (default: ``sage.interfaces.singular.singular``)
50125015
50135016
EXAMPLES::
50145017
@@ -5023,6 +5026,8 @@ cdef class MPolynomial_libsingular(MPolynomial):
50235026
sage: P(0)._singular_init_()
50245027
'0'
50255028
"""
5029+
if singular is None:
5030+
from sage.interfaces.singular import singular
50265031
self._parent._singular_().set_ring()
50275032
return self._repr_short_()
50285033

@@ -5071,7 +5076,7 @@ cdef class MPolynomial_libsingular(MPolynomial):
50715076

50725077
return new_MP(self._parent, p_Minus_mm_Mult_qq(p_Copy(self._poly, r), m._poly, q._poly, r))
50735078

5074-
def _macaulay2_(self, macaulay2=macaulay2_default):
5079+
def _macaulay2_(self, macaulay2=None):
50755080
"""
50765081
Return a Macaulay2 element corresponding to this polynomial.
50775082
@@ -5110,6 +5115,8 @@ cdef class MPolynomial_libsingular(MPolynomial):
51105115
sage: macaulay2(R('4')).ring()._operator('===', R) # optional - macaulay2
51115116
true
51125117
"""
5118+
if macaulay2 is None:
5119+
from sage.interfaces.macaulay2 import macaulay2
51135120
m2_parent = macaulay2(self.parent())
51145121
macaulay2.use(m2_parent)
51155122
return macaulay2('substitute(%s,%s)' % (repr(self), m2_parent._name))

‎src/sage/rings/polynomial/multi_polynomial_ring.py

+5-8
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,8 @@
7070
from sage.rings.polynomial.polydict import PolyDict, ETuple
7171
from sage.rings.polynomial.term_order import TermOrder
7272

73-
from sage.interfaces.singular import is_SingularElement
74-
from sage.interfaces.macaulay2 import is_Macaulay2Element
73+
import sage.interfaces.abc
74+
7575
from sage.libs.pari.all import pari_gen
7676

7777
from sage.structure.element import Element
@@ -489,7 +489,7 @@ def __call__(self, x=0, check=True):
489489
else:
490490
raise TypeError("unable to coerce since the denominator is not 1")
491491

492-
elif is_SingularElement(x) and self._has_singular:
492+
elif isinstance(x, sage.interfaces.abc.SingularElement) and self._has_singular:
493493
self._singular_().set_ring()
494494
try:
495495
return x.sage_poly(self)
@@ -507,7 +507,7 @@ def __call__(self, x=0, check=True):
507507
raise TypeError("unable to evaluate {!r} in {}".format(x, self))
508508
return self(x)
509509

510-
elif is_Macaulay2Element(x):
510+
elif isinstance(x, sage.interfaces.abc.Macaulay2Element):
511511
try:
512512
s = x.sage_polystring()
513513
if len(s) == 0:
@@ -927,10 +927,7 @@ def ideal(self, *gens, **kwds):
927927
if not self._has_singular:
928928
# pass through
929929
MPolynomialRing_base.ideal(self, gens, **kwds)
930-
if is_SingularElement(gens):
931-
gens = list(gens)
932-
do_coerce = True
933-
if is_Macaulay2Element(gens):
930+
if isinstance(gens, (sage.interfaces.abc.SingularElement, sage.interfaces.abc.Macaulay2Element)):
934931
gens = list(gens)
935932
do_coerce = True
936933
elif not isinstance(gens, (list, tuple)):

‎src/sage/rings/polynomial/pbori/pbori.pyx

+5-4
Original file line numberDiff line numberDiff line change
@@ -217,8 +217,9 @@ from sage.categories.action cimport Action
217217
from sage.monoids.monoid import Monoid_class
218218

219219
from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing
220-
from sage.interfaces.singular import singular as singular_default
221-
from sage.interfaces.singular import SingularElement
220+
221+
import sage.interfaces.abc
222+
222223

223224
order_dict = {"lp": pblp,
224225
"dlex": pbdlex,
@@ -997,7 +998,7 @@ cdef class BooleanPolynomialRing(MPolynomialRing_base):
997998
m *= var_mapping[j]
998999
p += m
9991000
return p
1000-
elif isinstance(other, SingularElement):
1001+
elif isinstance(other, sage.interfaces.abc.SingularElement):
10011002
other = str(other)
10021003

10031004
if isinstance(other, str):
@@ -1428,7 +1429,7 @@ cdef class BooleanPolynomialRing(MPolynomialRing_base):
14281429
G = R.gens()
14291430
return R.ideal([x**2 + x for x in G])
14301431

1431-
def _singular_init_(self, singular=singular_default):
1432+
def _singular_init_(self, singular=None):
14321433
r"""
14331434
Return a newly created Singular quotient ring matching this boolean
14341435
polynomial ring.

‎src/sage/rings/polynomial/polynomial_element.pyx

+2-1
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,6 @@ from sage.structure.factorization import Factorization
8686
from sage.structure.richcmp cimport (richcmp, richcmp_item,
8787
rich_to_bool, rich_to_bool_sgn)
8888

89-
from sage.interfaces.singular import singular as singular_default, is_SingularElement
9089
from sage.libs.pari.all import pari, pari_gen, PariError
9190

9291
cimport sage.rings.abc
@@ -99,6 +98,8 @@ from sage.rings.real_double import RDF
9998
from sage.rings.complex_double import CDF
10099
import sage.rings.abc
101100

101+
import sage.interfaces.abc
102+
102103
from sage.structure.coerce cimport coercion_model
103104
from sage.structure.element import coerce_binop
104105
from sage.structure.element cimport (parent, have_same_parent,

‎src/sage/rings/polynomial/polynomial_ring.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@
177177

178178
from . import cyclotomic
179179

180-
from sage.interfaces.singular import SingularElement
180+
import sage.interfaces.abc
181181

182182

183183
def is_PolynomialRing(x):
@@ -435,13 +435,13 @@ def _element_constructor_(self, x=None, check=True, is_gen=False,
435435
elif P == self.base_ring():
436436
return C(self, [x], check=True, is_gen=False,
437437
construct=construct)
438-
if isinstance(x, SingularElement) and self._has_singular:
438+
if isinstance(x, sage.interfaces.abc.SingularElement) and self._has_singular:
439439
self._singular_().set_ring()
440440
try:
441441
return x.sage_poly(self)
442442
except Exception:
443443
raise TypeError("Unable to coerce singular object")
444-
elif isinstance(x , str):
444+
elif isinstance(x, str):
445445
try:
446446
from sage.misc.parser import Parser, LookupNameMaker
447447
R = self.base_ring()

‎src/sage/rings/power_series_ring.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@
149149
import sage.misc.latex as latex
150150
from sage.structure.nonexact import Nonexact
151151

152-
from sage.interfaces.magma import MagmaElement
152+
from sage.interfaces.abc import MagmaElement
153153
from sage.rings.fraction_field_element import FractionFieldElement
154154
from sage.misc.sage_eval import sage_eval
155155

‎src/sage/rings/quotient_ring.py

+5-9
Original file line numberDiff line numberDiff line change
@@ -115,17 +115,13 @@
115115
from sage.categories.rings import Rings
116116
from sage.categories.commutative_rings import CommutativeRings
117117

118+
import sage.interfaces.abc
118119

119120
_Rings = Rings()
120121
_CommRings = CommutativeRings()
121122

122123

123124
MPolynomialIdeal_quotient = None
124-
try:
125-
from sage.interfaces.singular import singular as singular_default, is_SingularElement
126-
except ImportError:
127-
is_singularElement = lambda x : False
128-
singular_default = None
129125

130126

131127
def QuotientRing(R, I, names=None, **kwds):
@@ -959,7 +955,7 @@ def ideal(self, *gens, **kwds):
959955
if not (isinstance(self.__R, MPolynomialRing_base) and self.__R._has_singular):
960956
# pass through
961957
return super().ideal(gens, **kwds)
962-
if is_SingularElement(gens):
958+
if isinstance(gens, sage.interfaces.abc.SingularElement):
963959
gens = list(gens)
964960
elif not isinstance(gens, (list, tuple)):
965961
gens = [gens]
@@ -1015,7 +1011,7 @@ def _element_constructor_(self, x, coerce=True):
10151011
if x.parent() is self:
10161012
return x
10171013
x = x.lift()
1018-
if is_SingularElement(x):
1014+
if isinstance(x, sage.interfaces.abc.SingularElement):
10191015
# self._singular_().set_ring()
10201016
x = self.element_class(self, x.sage_poly(self.cover_ring()))
10211017
return x
@@ -1181,7 +1177,7 @@ def gen(self, i=0):
11811177
"""
11821178
return self(self.__R.gen(i))
11831179

1184-
def _singular_(self, singular=singular_default):
1180+
def _singular_(self, singular=None):
11851181
"""
11861182
Returns the Singular quotient ring of ``self`` if the base ring is
11871183
coercible to Singular.
@@ -1213,7 +1209,7 @@ def _singular_(self, singular=singular_default):
12131209
_[1]=x2+y2
12141210
"""
12151211
if singular is None:
1216-
raise ImportError("could not import singular")
1212+
from sage.interfaces.singular import singular
12171213

12181214
try:
12191215
Q = self.__singular

0 commit comments

Comments
 (0)
Please sign in to comment.