Skip to content

Commit f77d66a

Browse files
author
Release Manager
committed
sagemathgh-38061: `sage.rings`: Modularization fixes (imports) <!-- ^ Please provide a concise and informative title. --> <!-- ^ Don't put issue numbers in the title, do this in the PR description below. --> <!-- ^ For example, instead of "Fixes sagemath#12345" use "Introduce new method to calculate 1 + 2". --> <!-- v Describe your changes below in detail. --> <!-- v Why is this change required? What problem does it solve? --> <!-- v If this PR resolves an open issue, please link to it here. For example, "Fixes sagemath#12345". --> Replacing unconditional imports from `sage.libs.pari`, `sage.misc.sage_eval`, `sage.rings.number_field`, `sage.rings.polynomial.pbori`, `sage.symbolic` using standard modularization techniques. - Cherry-picked from sagemath#35095 ### 📝 Checklist <!-- Put an `x` in all the boxes that apply. --> - [x] The title is concise and informative. - [ ] The description explains in detail what this PR is about. - [x] I have linked a relevant issue or discussion. - [ ] I have created tests covering the changes. - [ ] I have updated the documentation and checked the documentation preview. ### ⌛ Dependencies <!-- List all open PRs that this PR logically depends on. For example, --> <!-- - sagemath#12345: short description why this is a dependency --> <!-- - sagemath#34567: ... --> URL: sagemath#38061 Reported by: Matthias Köppe Reviewer(s): Kwankyu Lee
2 parents c12ab15 + 40538a1 commit f77d66a

File tree

11 files changed

+90
-66
lines changed

11 files changed

+90
-66
lines changed

src/sage/rings/asymptotic/asymptotics_multivariate_generating_functions.py

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -199,18 +199,20 @@
199199
from functools import total_ordering
200200
from itertools import combinations_with_replacement
201201

202-
from sage.structure.element import RingElement
203-
from sage.structure.unique_representation import UniqueRepresentation
204-
from sage.structure.parent import Parent
205-
from sage.calculus.var import var
206-
from sage.calculus.functional import diff
207-
from sage.symbolic.ring import SR
202+
from sage.categories.rings import Rings
203+
from sage.misc.lazy_import import lazy_import
208204
from sage.misc.misc_c import prod
209205
from sage.rings.integer import Integer
210206
from sage.rings.integer_ring import ZZ
211207
from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing
212-
from sage.categories.rings import Rings
208+
from sage.structure.element import RingElement
209+
from sage.structure.parent import Parent
213210
from sage.structure.richcmp import richcmp_by_eq_and_lt
211+
from sage.structure.unique_representation import UniqueRepresentation
212+
213+
lazy_import("sage.calculus.var", "var")
214+
lazy_import("sage.calculus.functional", "diff")
215+
lazy_import("sage.symbolic.ring", "SR")
214216

215217

216218
@total_ordering

src/sage/rings/complex_arb.pyx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,8 @@ from sage.libs.gsl.complex cimport gsl_complex_rect
179179
from sage.rings.real_double cimport RealDoubleElement
180180
from sage.rings.complex_double cimport ComplexDoubleElement
181181
from sage.rings.integer cimport Integer
182+
from sage.rings.rational_field import QQ
183+
from sage.rings.number_field.number_field_base import NumberField
182184
from sage.rings.polynomial.polynomial_complex_arb cimport Polynomial_complex_arb
183185
from sage.rings.real_arb cimport mpfi_to_arb, arb_to_mpfi
184186
from sage.rings.real_arb import RealBallField
@@ -568,8 +570,7 @@ class ComplexBallField(UniqueRepresentation, sage.rings.abc.ComplexBallField):
568570
elif isinstance(other, ComplexBallField):
569571
return other._prec >= self._prec
570572

571-
import sage.rings.number_field.number_field as number_field
572-
if isinstance(other, number_field.NumberField_generic):
573+
if other is not QQ and isinstance(other, NumberField):
573574
emb = other.coerce_embedding()
574575
return emb is not None and self.has_coerce_map_from(emb.codomain())
575576

src/sage/rings/complex_mpc.pyx

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,11 @@ from sage.structure.parent cimport Parent
7272
from sage.structure.element cimport Element
7373
from sage.structure.richcmp cimport rich_to_bool
7474
from sage.categories.map cimport Map
75-
from sage.libs.pari.all import pari
75+
76+
try:
77+
from sage.libs.pari.all import pari, pari_gen, PariError
78+
except ImportError:
79+
pari_gen = PariError = ()
7680

7781
from sage.rings.integer cimport Integer
7882
from sage.rings.complex_mpfr cimport ComplexNumber
@@ -842,7 +846,7 @@ cdef class MPComplexNumber(sage.structure.element.FieldElement):
842846
elif isinstance(z, ComplexNumber):
843847
mpc_set_fr_fr(self.value, (<ComplexNumber>z).__re, (<ComplexNumber>z).__im, rnd)
844848
return
845-
elif isinstance(z, sage.libs.pari.all.pari_gen):
849+
elif isinstance(z, pari_gen):
846850
real, imag = z.real(), z.imag()
847851
elif isinstance(z, (list, tuple)):
848852
real, imag = z
@@ -2238,7 +2242,7 @@ cdef class MPComplexNumber(sage.structure.element.FieldElement):
22382242
"""
22392243
try:
22402244
return self._parent(self.__pari__().eta(not omit_frac))
2241-
except sage.libs.pari.all.PariError:
2245+
except PariError:
22422246
raise ValueError("value must be in the upper half plane")
22432247

22442248
def gamma(self):
@@ -2264,7 +2268,7 @@ cdef class MPComplexNumber(sage.structure.element.FieldElement):
22642268
"""
22652269
try:
22662270
return self._parent(self.__pari__().gamma())
2267-
except sage.libs.pari.all.PariError:
2271+
except PariError:
22682272
from sage.rings.infinity import UnsignedInfinityRing
22692273
return UnsignedInfinityRing.gen()
22702274

src/sage/rings/complex_mpfr.pyx

Lines changed: 9 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -65,13 +65,9 @@ except ImportError:
6565

6666
# Some objects that are not imported at startup in order to break
6767
# circular imports
68-
NumberFieldElement_quadratic = None
69-
AlgebraicNumber_base = None
70-
AlgebraicNumber = None
71-
AlgebraicReal = None
68+
NumberFieldElement_quadratic = ()
7269
AA = None
7370
QQbar = None
74-
SR = None
7571
CDF = CLF = RLF = None
7672
def late_import():
7773
"""
@@ -82,25 +78,14 @@ def late_import():
8278
sage: sage.rings.complex_mpfr.late_import()
8379
"""
8480
global NumberFieldElement_quadratic
85-
global AlgebraicNumber_base
86-
global AlgebraicNumber
87-
global AlgebraicReal
88-
global UniversalCyclotomicField
89-
global AA, QQbar, SR
81+
global AA, QQbar
9082
global CLF, RLF, CDF
91-
if NumberFieldElement_quadratic is None:
92-
import sage.rings.number_field.number_field
93-
import sage.rings.number_field.number_field_element_quadratic as nfeq
94-
NumberFieldElement_quadratic = nfeq.NumberFieldElement_quadratic
95-
import sage.rings.qqbar
96-
AlgebraicNumber_base = sage.rings.qqbar.AlgebraicNumber_base
97-
AlgebraicNumber = sage.rings.qqbar.AlgebraicNumber
98-
AlgebraicReal = sage.rings.qqbar.AlgebraicReal
99-
from sage.rings.universal_cyclotomic_field import UniversalCyclotomicField
100-
AA = sage.rings.qqbar.AA
101-
QQbar = sage.rings.qqbar.QQbar
102-
import sage.symbolic.ring
103-
SR = sage.symbolic.ring.SR
83+
if CLF is None:
84+
try:
85+
from sage.rings.number_field.number_field_element_quadratic import NumberFieldElement_quadratic
86+
from sage.rings.qqbar import AA, QQbar
87+
except ImportError:
88+
pass
10489
from sage.rings.real_lazy import CLF, RLF
10590
from sage.rings.complex_double import CDF
10691

@@ -586,7 +571,7 @@ class ComplexField_class(sage.rings.abc.ComplexField):
586571
# parts of real elements) that get picked for conversion from UCF both
587572
# to CC and to other types of complex fields depend in which order the
588573
# coercions are discovered.
589-
if isinstance(S, UniversalCyclotomicField):
574+
if isinstance(S, sage.rings.abc.UniversalCyclotomicField):
590575
return self._generic_coerce_map(S)
591576
return self._coerce_map_via([CLF], S)
592577

src/sage/rings/fraction_field.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -680,7 +680,11 @@ def _element_constructor_(self, x, y=None, coerce=True):
680680
x = py_scalar_to_element(x)
681681
y = py_scalar_to_element(y)
682682

683-
from sage.libs.pari.all import pari_gen
683+
try:
684+
from sage.libs.pari.all import pari_gen
685+
except ImportError:
686+
pari_gen = ()
687+
684688
if isinstance(x, pari_gen) and x.type() == 't_POL':
685689
# This recursive approach is needed because PARI
686690
# represents multivariate polynomials as iterated

src/sage/rings/infinity.py

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1285,7 +1285,10 @@ def _pushout_(self, other):
12851285
sage: QQbar(-2*i)*infinity # needs sage.rings.number_field sage.symbolic
12861286
(-I)*Infinity
12871287
"""
1288-
from sage.symbolic.ring import SR
1288+
try:
1289+
from sage.symbolic.ring import SR
1290+
except ImportError:
1291+
return None
12891292
if SR.has_coerce_map_from(other):
12901293
return SR
12911294

@@ -1801,10 +1804,15 @@ def test_comparison(ring):
18011804
...
18021805
AssertionError: testing -1000.0 in Symbolic Ring: id = ...
18031806
"""
1804-
from sage.symbolic.ring import SR
1807+
18051808
from sage.rings.rational_field import QQ
1806-
elements = [-1e3, 99.9999, -SR(2).sqrt(), 0, 1,
1807-
3 ** (-QQ.one() / 3), SR.pi(), 100000]
1809+
elements = [-1e3, 99.9999, 0, 1, 100000]
1810+
try:
1811+
from sage.symbolic.ring import SR
1812+
except ImportError:
1813+
pass
1814+
else:
1815+
elements += [-SR(2).sqrt(), SR.pi(), 3 ** (-QQ.one() / 3)]
18081816
elements.append(ring.an_element())
18091817
elements.extend(ring.some_elements())
18101818
for z in elements:

src/sage/rings/integer_ring.pyx

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,6 @@ import sage.rings.infinity
5454
import sage.rings.rational
5555
import sage.rings.rational_field
5656
import sage.rings.ideal
57-
import sage.libs.pari.all
58-
import sage.rings.ideal
5957
from sage.categories.basic import EuclideanDomains, DedekindDomains
6058
from sage.categories.infinite_enumerated_sets import InfiniteEnumeratedSets
6159
from sage.categories.noetherian_rings import NoetherianRings

src/sage/rings/polynomial/multi_polynomial_libsingular.pyx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -215,16 +215,18 @@ from sage.libs.singular.ring cimport singular_ring_new, singular_ring_reference,
215215

216216
# polynomial imports
217217
from sage.rings.polynomial.multi_polynomial_ring import MPolynomialRing_polydict, MPolynomialRing_polydict_domain
218+
from sage.rings.polynomial.multi_polynomial_ring_base import BooleanPolynomialRing_base
218219
from sage.rings.polynomial.multi_polynomial_element import MPolynomial_polydict
219220
from sage.rings.polynomial.multi_polynomial_ideal import MPolynomialIdeal
220221
from sage.rings.polynomial.polydict cimport ETuple
221222
from sage.rings.polynomial.polynomial_ring import is_PolynomialRing
222223

223224
# base ring imports
224225
import sage.rings.abc
226+
import sage.structure.element
227+
225228
from sage.rings.rational cimport Rational
226229
from sage.rings.rational_field import QQ
227-
import sage.rings.abc
228230
from sage.rings.integer_ring import is_IntegerRing, ZZ
229231
from sage.rings.integer cimport Integer
230232
from sage.rings.number_field.number_field_base cimport NumberField
@@ -950,8 +952,7 @@ cdef class MPolynomialRing_libsingular(MPolynomialRing_base):
950952
raise
951953
return new_MP(self, _p)
952954

953-
from sage.rings.polynomial.pbori.pbori import BooleanPolynomial
954-
if isinstance(element, BooleanPolynomial):
955+
if isinstance(element, sage.structure.element.Element) and isinstance(element.parent(), BooleanPolynomialRing_base):
955956
if element.constant():
956957
if element:
957958
return self._one_element

src/sage/rings/power_series_ring.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@
137137
import sage.categories.commutative_rings as commutative_rings
138138
import sage.misc.latex as latex
139139
from sage.interfaces.abc import MagmaElement
140-
from sage.misc.sage_eval import sage_eval
140+
from sage.misc.lazy_import import lazy_import
141141
from sage.rings import (
142142
integer,
143143
laurent_series_ring,
@@ -167,6 +167,8 @@
167167

168168
from sage.categories.complete_discrete_valuation import CompleteDiscreteValuationRings
169169

170+
lazy_import('sage.misc.sage_eval', 'sage_eval')
171+
170172
try:
171173
from .laurent_series_ring import LaurentSeriesRing
172174
from .laurent_series_ring_element import LaurentSeries

src/sage/rings/quotient_ring.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -307,7 +307,7 @@ def QuotientRing(R, I, names=None, **kwds):
307307
kwds.pop('implementation')
308308
return BooleanPolynomialRing(R.ngens(), names=names, **kwds)
309309
# workaround to silence warning from #34806
310-
from sage.rings.number_field.order import Order
310+
from sage.rings.abc import Order
311311
if isinstance(R, Order):
312312
if not R.is_maximal():
313313
raise NotImplementedError('only implemented for maximal orders')
@@ -480,7 +480,7 @@ def __init__(self, R, I, names, category=None):
480480
if R not in _Rings:
481481
raise TypeError("The first argument must be a ring, but %s is not" % R)
482482
# workaround to silence warning from #34806
483-
from sage.rings.number_field.order import Order
483+
from sage.rings.abc import Order
484484
if isinstance(R, Order):
485485
M = R.number_field().ideal_monoid()
486486
else:

0 commit comments

Comments
 (0)