Skip to content

Commit 13e4d12

Browse files
author
Matthias Koeppe
committed
sage.rings: Break an import cycle
1 parent 118f2e0 commit 13e4d12

File tree

3 files changed

+38
-8
lines changed

3 files changed

+38
-8
lines changed

src/sage/rings/rational.pyx

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,26 @@ from sage.categories.morphism cimport Morphism
8787
from sage.categories.map cimport Map
8888

8989

90-
import sage.rings.real_mpfr
91-
import sage.rings.real_double
90+
RealNumber_classes = ()
91+
92+
def _register_real_number_class(cls):
93+
r"""
94+
Register ``cls``.
95+
96+
This is called by ``sage.rings.real_mpfr``, to avoid a cyclic import.
97+
"""
98+
global RealNumber_classes
99+
RealNumber_classes += (cls,)
100+
101+
102+
RealDouble_classes = (float,)
103+
try:
104+
from sage.rings.real_double import RealDoubleElement
105+
RealDouble_classes += (RealDoubleElement,)
106+
except ImportError:
107+
pass
108+
109+
92110
from libc.stdint cimport uint64_t
93111
from sage.libs.gmp.binop cimport mpq_add_z, mpq_mul_z, mpq_div_zz
94112

src/sage/rings/real_lazy.pyx

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -50,12 +50,16 @@ from sage.rings.integer import Integer
5050
cdef QQ, RR, CC, RealField, ComplexField
5151
from sage.rings.rational_field import QQ
5252

53-
try:
54-
from sage.rings.real_mpfr import RR, RealField
55-
from sage.rings.complex_mpfr import ComplexField
56-
from sage.rings.cc import CC
57-
except ImportError:
58-
pass
53+
cdef late_import():
54+
global RR, CC, RealField, ComplexField
55+
if CC is not None:
56+
return
57+
try:
58+
from sage.rings.real_mpfr import RR, RealField
59+
from sage.rings.complex_mpfr import ComplexField
60+
from sage.rings.cc import CC
61+
except ImportError:
62+
pass
5963

6064
cdef _QQx = None
6165

@@ -1611,6 +1615,9 @@ cdef class LazyAlgebraic(LazyFieldElement):
16111615
if self._poly.degree() == 2:
16121616
c, b, a = self._poly.list()
16131617
self._quadratic_disc = b*b - 4*a*c
1618+
1619+
late_import()
1620+
16141621
if isinstance(parent, RealLazyField_class):
16151622
if not self._poly.number_of_real_roots():
16161623
raise ValueError("%s has no real roots" % self._poly)

src/sage/rings/real_mpfr.pyx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6014,6 +6014,11 @@ cdef class int_toRR(Map):
60146014
return y
60156015

60166016

6017+
# Hook into Rational
6018+
from sage.rings.rational import _register_real_number_class
6019+
_register_real_number_class(RealNumber)
6020+
6021+
60176022
# Support Python's numbers abstract base class
60186023
import numbers
60196024
numbers.Real.register(RealNumber)

0 commit comments

Comments
 (0)