From 99ae00c2ecb1ffcb8895697f34861f05dea840e6 Mon Sep 17 00:00:00 2001 From: Tobias Diez Date: Thu, 8 Oct 2020 23:47:39 +0200 Subject: [PATCH 1/4] Replace startup exception by warning --- src/sage/misc/lazy_import.pyx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sage/misc/lazy_import.pyx b/src/sage/misc/lazy_import.pyx index 9de1859fd3f..96ffb17a56c 100644 --- a/src/sage/misc/lazy_import.pyx +++ b/src/sage/misc/lazy_import.pyx @@ -217,7 +217,7 @@ cdef class LazyImport(object): return self._object if startup_guard and not self._at_startup: - raise RuntimeError(f"resolving lazy import {self._name} during startup") + print(f"Resolving lazy import {self._name} during startup") elif self._at_startup and not startup_guard: print('Option ``at_startup=True`` for lazy import {0} not needed anymore'.format(self._name)) try: From 11882e531bc80f6397f00d6a5a095b97a9e93804 Mon Sep 17 00:00:00 2001 From: Tobias Diez Date: Sun, 11 Oct 2020 17:27:30 +0200 Subject: [PATCH 2/4] Use context manager --- src/sage/all_cmdline.py | 9 +++-- src/sage/misc/lazy_import.pyx | 67 ++-------------------------------- src/sage/misc/startup_guard.py | 25 +++++++++++++ 3 files changed, 34 insertions(+), 67 deletions(-) create mode 100644 src/sage/misc/startup_guard.py diff --git a/src/sage/all_cmdline.py b/src/sage/all_cmdline.py index e49b24aa874..82be5acd986 100644 --- a/src/sage/all_cmdline.py +++ b/src/sage/all_cmdline.py @@ -23,8 +23,9 @@ sage_mode = 'cmdline' -from sage.all import * -from sage.calculus.predefined import x - -sage.misc.session.init() +import sage.misc.startup_guard as startup_guard +with startup_guard.startup(): + from sage.all import * + from sage.calculus.predefined import x + sage.misc.session.init() diff --git a/src/sage/misc/lazy_import.pyx b/src/sage/misc/lazy_import.pyx index 96ffb17a56c..7d0e62b0785 100644 --- a/src/sage/misc/lazy_import.pyx +++ b/src/sage/misc/lazy_import.pyx @@ -58,6 +58,7 @@ AUTHOR: cimport cython from cpython.object cimport PyObject_RichCompare from cpython.number cimport PyNumber_TrueDivide, PyNumber_Power, PyNumber_Index +import sage.misc.startup_guard as startup_guard cdef extern from *: int likely(int) nogil # Defined by Cython @@ -76,66 +77,6 @@ cdef inline obj(x): else: return x - -# boolean to determine whether Sage is still starting up -cdef bint startup_guard = True - - -cpdef finish_startup(): - """ - This function must be called exactly once at the end of the Sage - import process - - TESTS:: - - sage: from sage.misc.lazy_import import finish_startup - sage: finish_startup() - Traceback (most recent call last): - ... - AssertionError: finish_startup() must be called exactly once - """ - global startup_guard - assert startup_guard, 'finish_startup() must be called exactly once' - startup_guard = False - -cpdef bint is_during_startup(): - """ - Return whether Sage is currently starting up. - - OUTPUT: - - Boolean - - TESTS:: - - sage: from sage.misc.lazy_import import is_during_startup - sage: is_during_startup() - False - """ - global startup_guard - return startup_guard - -cpdef test_fake_startup(): - """ - For testing purposes only. - - Switch the startup lazy import guard back on. - - EXAMPLES:: - - sage: sage.misc.lazy_import.test_fake_startup() - sage: from sage.misc.lazy_import import lazy_import - sage: lazy_import('sage.rings.all', 'ZZ', 'my_ZZ') - sage: my_ZZ(123) - Traceback (most recent call last): - ... - RuntimeError: resolving lazy import ZZ during startup - sage: sage.misc.lazy_import.finish_startup() - """ - global startup_guard - startup_guard = True - - @cython.final cdef class LazyImport(object): """ @@ -216,9 +157,9 @@ cdef class LazyImport(object): if self._object is not None: return self._object - if startup_guard and not self._at_startup: - print(f"Resolving lazy import {self._name} during startup") - elif self._at_startup and not startup_guard: + if startup_guard.IS_STARTUP and not self._at_startup: + raise RuntimeError(f"resolving lazy import {self._name} during startup") + elif self._at_startup and not startup_guard.IS_STARTUP: print('Option ``at_startup=True`` for lazy import {0} not needed anymore'.format(self._name)) try: self._object = getattr(__import__(self._module, {}, {}, [self._name]), self._name) diff --git a/src/sage/misc/startup_guard.py b/src/sage/misc/startup_guard.py new file mode 100644 index 00000000000..ee2e09844df --- /dev/null +++ b/src/sage/misc/startup_guard.py @@ -0,0 +1,25 @@ +from contextlib import contextmanager + +IS_STARTUP: bool = False + +@contextmanager +def startup(): + """ + Simple context manager to indicate whether Sage is currently starting, + e.g. importing `sage.all` etc. + + EXAMPLES:: + + >>> import sage.misc.startup_guard as startup_guard + >>> print(startup_guard.IS_STARTUP) + False + >>> with startup_guard.startup(): + >>> print(startup_guard.IS_STARTUP) + True + >>> print(startup_guard.IS_STARTUP) + False + """ + global IS_STARTUP + IS_STARTUP = True + yield + IS_STARTUP = False \ No newline at end of file From 6a52fbf72d83b2488845f4caeb15798ed5a217e7 Mon Sep 17 00:00:00 2001 From: Tobias Diez Date: Mon, 2 Nov 2020 20:51:30 +0100 Subject: [PATCH 3/4] Remove lazy import finish startup --- src/sage/all.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/sage/all.py b/src/sage/all.py index 3d144381cf6..4850a8e10ed 100644 --- a/src/sage/all.py +++ b/src/sage/all.py @@ -345,10 +345,6 @@ def _write_started_file(): # Sage startup). set_random_seed() - -# From now on it is ok to resolve lazy imports -sage.misc.lazy_import.finish_startup() - def sage_globals(): r""" Return the Sage namespace. From b952bb5661206b5614dfe6117c27021627b19616 Mon Sep 17 00:00:00 2001 From: Tobias Diez Date: Sat, 7 Nov 2020 21:25:09 +0100 Subject: [PATCH 4/4] Fix doctests --- src/sage/misc/startup_guard.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/sage/misc/startup_guard.py b/src/sage/misc/startup_guard.py index ee2e09844df..f3e017ab124 100644 --- a/src/sage/misc/startup_guard.py +++ b/src/sage/misc/startup_guard.py @@ -10,16 +10,16 @@ def startup(): EXAMPLES:: - >>> import sage.misc.startup_guard as startup_guard - >>> print(startup_guard.IS_STARTUP) + sage: import sage.misc.startup_guard as startup_guard + sage: print(startup_guard.IS_STARTUP) False - >>> with startup_guard.startup(): - >>> print(startup_guard.IS_STARTUP) + sage: with startup_guard.startup(): + sage: print(startup_guard.IS_STARTUP) True - >>> print(startup_guard.IS_STARTUP) + sage: print(startup_guard.IS_STARTUP) False """ global IS_STARTUP IS_STARTUP = True yield - IS_STARTUP = False \ No newline at end of file + IS_STARTUP = False