passagemath-setup 10.5.42__tar.gz → 10.6.1rc1__tar.gz

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 (67) hide show
  1. {passagemath_setup-10.5.42 → passagemath_setup-10.6.1rc1}/PKG-INFO +2 -3
  2. passagemath_setup-10.6.1rc1/VERSION.txt +1 -0
  3. {passagemath_setup-10.5.42 → passagemath_setup-10.6.1rc1}/passagemath_setup.egg-info/PKG-INFO +2 -3
  4. {passagemath_setup-10.5.42 → passagemath_setup-10.6.1rc1}/pyproject.toml +1 -2
  5. {passagemath_setup-10.5.42 → passagemath_setup-10.6.1rc1}/sage_setup/autogen/flint/reader.py +7 -2
  6. {passagemath_setup-10.5.42 → passagemath_setup-10.6.1rc1}/sage_setup/autogen/flint/templates/flint_sage.pyx.template +1 -1
  7. {passagemath_setup-10.5.42 → passagemath_setup-10.6.1rc1}/sage_setup/autogen/flint/templates/flint_wrap.h.template +4 -0
  8. {passagemath_setup-10.5.42 → passagemath_setup-10.6.1rc1}/sage_setup/autogen/flint/templates/types.pxd.template +16 -3
  9. {passagemath_setup-10.5.42 → passagemath_setup-10.6.1rc1}/sage_setup/autogen/interpreters/internal/generator.py +9 -8
  10. {passagemath_setup-10.5.42 → passagemath_setup-10.6.1rc1}/sage_setup/autogen/interpreters/internal/specs/cdf.py +10 -11
  11. {passagemath_setup-10.5.42 → passagemath_setup-10.6.1rc1}/sage_setup/autogen/interpreters/internal/specs/element.py +0 -1
  12. {passagemath_setup-10.5.42 → passagemath_setup-10.6.1rc1}/sage_setup/autogen/interpreters/internal/specs/python.py +6 -6
  13. {passagemath_setup-10.5.42 → passagemath_setup-10.6.1rc1}/sage_setup/autogen/interpreters/internal/specs/rr.py +0 -2
  14. {passagemath_setup-10.5.42 → passagemath_setup-10.6.1rc1}/sage_setup/command/sage_build_cython.py +1 -2
  15. {passagemath_setup-10.5.42 → passagemath_setup-10.6.1rc1}/sage_setup/util.py +2 -2
  16. passagemath_setup-10.5.42/VERSION.txt +0 -1
  17. {passagemath_setup-10.5.42 → passagemath_setup-10.6.1rc1}/README.rst +0 -0
  18. {passagemath_setup-10.5.42 → passagemath_setup-10.6.1rc1}/passagemath_setup.egg-info/SOURCES.txt +0 -0
  19. {passagemath_setup-10.5.42 → passagemath_setup-10.6.1rc1}/passagemath_setup.egg-info/dependency_links.txt +0 -0
  20. {passagemath_setup-10.5.42 → passagemath_setup-10.6.1rc1}/passagemath_setup.egg-info/requires.txt +0 -0
  21. {passagemath_setup-10.5.42 → passagemath_setup-10.6.1rc1}/passagemath_setup.egg-info/top_level.txt +0 -0
  22. {passagemath_setup-10.5.42 → passagemath_setup-10.6.1rc1}/pyproject.toml.m4 +0 -0
  23. {passagemath_setup-10.5.42 → passagemath_setup-10.6.1rc1}/requirements.txt +0 -0
  24. {passagemath_setup-10.5.42 → passagemath_setup-10.6.1rc1}/sage_setup/__init__.py +0 -0
  25. {passagemath_setup-10.5.42 → passagemath_setup-10.6.1rc1}/sage_setup/autogen/__init__.py +0 -0
  26. {passagemath_setup-10.5.42 → passagemath_setup-10.6.1rc1}/sage_setup/autogen/__main__.py +0 -0
  27. {passagemath_setup-10.5.42 → passagemath_setup-10.6.1rc1}/sage_setup/autogen/flint/README.md +0 -0
  28. {passagemath_setup-10.5.42 → passagemath_setup-10.6.1rc1}/sage_setup/autogen/flint/__init__.py +0 -0
  29. {passagemath_setup-10.5.42 → passagemath_setup-10.6.1rc1}/sage_setup/autogen/flint/env.py +0 -0
  30. {passagemath_setup-10.5.42 → passagemath_setup-10.6.1rc1}/sage_setup/autogen/flint/macros/acb_macros.pxd +0 -0
  31. {passagemath_setup-10.5.42 → passagemath_setup-10.6.1rc1}/sage_setup/autogen/flint/macros/acb_mat_macros.pxd +0 -0
  32. {passagemath_setup-10.5.42 → passagemath_setup-10.6.1rc1}/sage_setup/autogen/flint/macros/acb_poly_macros.pxd +0 -0
  33. {passagemath_setup-10.5.42 → passagemath_setup-10.6.1rc1}/sage_setup/autogen/flint/macros/arb_macros.pxd +0 -0
  34. {passagemath_setup-10.5.42 → passagemath_setup-10.6.1rc1}/sage_setup/autogen/flint/macros/arb_mat_macros.pxd +0 -0
  35. {passagemath_setup-10.5.42 → passagemath_setup-10.6.1rc1}/sage_setup/autogen/flint/macros/fmpq_mat_macros.pxd +0 -0
  36. {passagemath_setup-10.5.42 → passagemath_setup-10.6.1rc1}/sage_setup/autogen/flint/macros/fmpz_macros.pxd +0 -0
  37. {passagemath_setup-10.5.42 → passagemath_setup-10.6.1rc1}/sage_setup/autogen/flint/macros/fmpz_mat_macros.pxd +0 -0
  38. {passagemath_setup-10.5.42 → passagemath_setup-10.6.1rc1}/sage_setup/autogen/flint/macros/fmpz_poly_macros.pxd +0 -0
  39. {passagemath_setup-10.5.42 → passagemath_setup-10.6.1rc1}/sage_setup/autogen/flint/macros/mag_macros.pxd +0 -0
  40. {passagemath_setup-10.5.42 → passagemath_setup-10.6.1rc1}/sage_setup/autogen/flint/writer.py +0 -0
  41. {passagemath_setup-10.5.42 → passagemath_setup-10.6.1rc1}/sage_setup/autogen/flint_autogen.py +0 -0
  42. {passagemath_setup-10.5.42 → passagemath_setup-10.6.1rc1}/sage_setup/autogen/giacpy-mkkeywords.py +0 -0
  43. {passagemath_setup-10.5.42 → passagemath_setup-10.6.1rc1}/sage_setup/autogen/interpreters/__main__.py +0 -0
  44. {passagemath_setup-10.5.42 → passagemath_setup-10.6.1rc1}/sage_setup/autogen/interpreters/internal/__init__.py +0 -0
  45. {passagemath_setup-10.5.42 → passagemath_setup-10.6.1rc1}/sage_setup/autogen/interpreters/internal/instructions.py +0 -0
  46. {passagemath_setup-10.5.42 → passagemath_setup-10.6.1rc1}/sage_setup/autogen/interpreters/internal/memory.py +0 -0
  47. {passagemath_setup-10.5.42 → passagemath_setup-10.6.1rc1}/sage_setup/autogen/interpreters/internal/specs/__init__.py +0 -0
  48. {passagemath_setup-10.5.42 → passagemath_setup-10.6.1rc1}/sage_setup/autogen/interpreters/internal/specs/base.py +0 -0
  49. {passagemath_setup-10.5.42 → passagemath_setup-10.6.1rc1}/sage_setup/autogen/interpreters/internal/specs/cc.py +0 -0
  50. {passagemath_setup-10.5.42 → passagemath_setup-10.6.1rc1}/sage_setup/autogen/interpreters/internal/specs/rdf.py +0 -0
  51. {passagemath_setup-10.5.42 → passagemath_setup-10.6.1rc1}/sage_setup/autogen/interpreters/internal/storage.py +0 -0
  52. {passagemath_setup-10.5.42 → passagemath_setup-10.6.1rc1}/sage_setup/autogen/interpreters/internal/utils.py +0 -0
  53. {passagemath_setup-10.5.42 → passagemath_setup-10.6.1rc1}/sage_setup/command/__init__.py +0 -0
  54. {passagemath_setup-10.5.42 → passagemath_setup-10.6.1rc1}/sage_setup/command/sage_build_ext.py +0 -0
  55. {passagemath_setup-10.5.42 → passagemath_setup-10.6.1rc1}/sage_setup/command/sage_build_ext_minimal.py +0 -0
  56. {passagemath_setup-10.5.42 → passagemath_setup-10.6.1rc1}/sage_setup/command/sage_build_py.py +0 -0
  57. {passagemath_setup-10.5.42 → passagemath_setup-10.6.1rc1}/sage_setup/command/sage_install.py +0 -0
  58. {passagemath_setup-10.5.42 → passagemath_setup-10.6.1rc1}/sage_setup/cython_options.py +0 -0
  59. {passagemath_setup-10.5.42 → passagemath_setup-10.6.1rc1}/sage_setup/excepthook.py +0 -0
  60. {passagemath_setup-10.5.42 → passagemath_setup-10.6.1rc1}/sage_setup/extensions.py +0 -0
  61. {passagemath_setup-10.5.42 → passagemath_setup-10.6.1rc1}/sage_setup/find.py +0 -0
  62. {passagemath_setup-10.5.42 → passagemath_setup-10.6.1rc1}/sage_setup/library_order.py +0 -0
  63. {passagemath_setup-10.5.42 → passagemath_setup-10.6.1rc1}/sage_setup/run_parallel.py +0 -0
  64. {passagemath_setup-10.5.42 → passagemath_setup-10.6.1rc1}/sage_setup/setenv.py +0 -0
  65. {passagemath_setup-10.5.42 → passagemath_setup-10.6.1rc1}/setup.cfg +0 -0
  66. {passagemath_setup-10.5.42 → passagemath_setup-10.6.1rc1}/setup.py +0 -0
  67. {passagemath_setup-10.5.42 → passagemath_setup-10.6.1rc1}/tox.ini +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: passagemath-setup
3
- Version: 10.5.42
3
+ Version: 10.6.1rc1
4
4
  Summary: passagemath: Build system of the Sage library
5
5
  Author-email: The Sage Developers <sage-support@googlegroups.com>
6
6
  Maintainer: Matthias Köppe, passagemath contributors
@@ -19,14 +19,13 @@ Classifier: Intended Audience :: Science/Research
19
19
  Classifier: Operating System :: POSIX
20
20
  Classifier: Operating System :: MacOS :: MacOS X
21
21
  Classifier: Programming Language :: Python :: 3 :: Only
22
- Classifier: Programming Language :: Python :: 3.9
23
22
  Classifier: Programming Language :: Python :: 3.10
24
23
  Classifier: Programming Language :: Python :: 3.11
25
24
  Classifier: Programming Language :: Python :: 3.12
26
25
  Classifier: Programming Language :: Python :: 3.13
27
26
  Classifier: Programming Language :: Python :: Implementation :: CPython
28
27
  Classifier: Topic :: Scientific/Engineering :: Mathematics
29
- Requires-Python: <3.14,>=3.9
28
+ Requires-Python: <3.14,>=3.10
30
29
  Description-Content-Type: text/x-rst
31
30
  Provides-Extra: autogen
32
31
  Requires-Dist: jinja2; extra == "autogen"
@@ -0,0 +1 @@
1
+ 10.6.1.rc1
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: passagemath-setup
3
- Version: 10.5.42
3
+ Version: 10.6.1rc1
4
4
  Summary: passagemath: Build system of the Sage library
5
5
  Author-email: The Sage Developers <sage-support@googlegroups.com>
6
6
  Maintainer: Matthias Köppe, passagemath contributors
@@ -19,14 +19,13 @@ Classifier: Intended Audience :: Science/Research
19
19
  Classifier: Operating System :: POSIX
20
20
  Classifier: Operating System :: MacOS :: MacOS X
21
21
  Classifier: Programming Language :: Python :: 3 :: Only
22
- Classifier: Programming Language :: Python :: 3.9
23
22
  Classifier: Programming Language :: Python :: 3.10
24
23
  Classifier: Programming Language :: Python :: 3.11
25
24
  Classifier: Programming Language :: Python :: 3.12
26
25
  Classifier: Programming Language :: Python :: 3.13
27
26
  Classifier: Programming Language :: Python :: Implementation :: CPython
28
27
  Classifier: Topic :: Scientific/Engineering :: Mathematics
29
- Requires-Python: <3.14,>=3.9
28
+ Requires-Python: <3.14,>=3.10
30
29
  Description-Content-Type: text/x-rst
31
30
  Provides-Extra: autogen
32
31
  Requires-Dist: jinja2; extra == "autogen"
@@ -24,7 +24,6 @@ classifiers = [
24
24
  "Operating System :: POSIX",
25
25
  "Operating System :: MacOS :: MacOS X",
26
26
  "Programming Language :: Python :: 3 :: Only",
27
- "Programming Language :: Python :: 3.9",
28
27
  "Programming Language :: Python :: 3.10",
29
28
  "Programming Language :: Python :: 3.11",
30
29
  "Programming Language :: Python :: 3.12",
@@ -32,7 +31,7 @@ classifiers = [
32
31
  "Programming Language :: Python :: Implementation :: CPython",
33
32
  "Topic :: Scientific/Engineering :: Mathematics",
34
33
  ]
35
- requires-python = ">=3.9, <3.14"
34
+ requires-python = ">=3.10, <3.14"
36
35
 
37
36
  [project.urls]
38
37
  "release notes" = "https://github.com/passagemath/passagemath/releases"
@@ -176,11 +176,16 @@ class Extractor:
176
176
  line = self.lines[self.i]
177
177
  if line.startswith('.. function::'):
178
178
  self.add_declaration()
179
- if line[13] != ' ':
179
+ line_rest = line.removeprefix('.. function::')
180
+ if not line_rest.startswith(' '):
180
181
  print('Warning: no space {}'.format(line))
181
- self.signatures.append(line[13:].strip())
182
182
  self.state = self.FUNCTION_DECLARATION
183
183
  self.i += 1
184
+ signature = line_rest.strip()
185
+ while signature.endswith('\\'):
186
+ signature = signature.removesuffix('\\').strip() + ' ' + self.lines[self.i].strip()
187
+ self.i += 1
188
+ self.signatures.append(signature)
184
189
  elif line.startswith('.. macro::'):
185
190
  self.add_declaration()
186
191
  if line[10] != ' ':
@@ -13,7 +13,7 @@ Import this module::
13
13
 
14
14
  sage: import sage.libs.flint.flint_sage
15
15
 
16
- We verify that :trac:`6919` is correctly fixed::
16
+ We verify that :issue:`6919` is correctly fixed::
17
17
 
18
18
  sage: R.<x> = PolynomialRing(ZZ)
19
19
  sage: A = 2^(2^17+2^15)
@@ -30,6 +30,10 @@
30
30
  #pragma push_macro("I")
31
31
  #define I Iv
32
32
 
33
+ /* flint 3.2 will rename flint_rand_s to flint_rand_struct
34
+ * the following line can be removed when flint 3.1 is gone */
35
+ #define flint_rand_s flint_rand_struct
36
+
33
37
  #include <flint/flint.h>
34
38
 
35
39
  /* If flint was already previously included via another header (e.g.
@@ -24,6 +24,9 @@ ctypedef mp_limb_t ulong
24
24
  ctypedef mp_limb_signed_t slong
25
25
  ctypedef mp_limb_t flint_bitcnt_t
26
26
 
27
+ # New in flint 3.2.0-rc1
28
+ ctypedef mp_ptr nn_ptr
29
+ ctypedef mp_srcptr nn_srcptr
27
30
 
28
31
  cdef extern from "flint_wrap.h":
29
32
  # flint/fmpz.h
@@ -266,9 +269,19 @@ cdef extern from "flint_wrap.h":
266
269
 
267
270
 
268
271
  # flint/flint.h
269
- ctypedef struct flint_rand_s:
270
- pass
271
- ctypedef flint_rand_s flint_rand_t[1]
272
+ ctypedef struct flint_rand_struct:
273
+ pass
274
+ ctypedef flint_rand_struct flint_rand_t[1]
275
+ ctypedef enum flint_err_t:
276
+ # flint_autogen.py does not support parsing .. enum:: yet
277
+ FLINT_ERROR
278
+ FLINT_OVERFLOW
279
+ FLINT_IMPINV
280
+ FLINT_DOMERR
281
+ FLINT_DIVZERO
282
+ FLINT_EXPOF
283
+ FLINT_INEXACT
284
+ FLINT_TEST_FAIL
272
285
 
273
286
  cdef long FLINT_BITS
274
287
  cdef long FLINT_D_BITS
@@ -1,4 +1,4 @@
1
- #*****************************************************************************
1
+ # ***************************************************************************
2
2
  # Copyright (C) 2009 Carl Witty <Carl.Witty@gmail.com>
3
3
  # Copyright (C) 2015 Jeroen Demeyer <jdemeyer@cage.ugent.be>
4
4
  #
@@ -6,8 +6,8 @@
6
6
  # it under the terms of the GNU General Public License as published by
7
7
  # the Free Software Foundation, either version 2 of the License, or
8
8
  # (at your option) any later version.
9
- # http://www.gnu.org/licenses/
10
- #*****************************************************************************
9
+ # https://www.gnu.org/licenses/
10
+ # ***************************************************************************
11
11
 
12
12
  """Implements the generic interpreter generator."""
13
13
 
@@ -23,7 +23,7 @@ from .utils import je, indent_lines, reindent_lines as ri
23
23
  AUTOGEN_WARN = "Automatically generated by {}. Do not edit!".format(__file__)
24
24
 
25
25
 
26
- class InterpreterGenerator(object):
26
+ class InterpreterGenerator:
27
27
  r"""
28
28
  This class takes an InterpreterSpec and generates the corresponding
29
29
  C interpreter and Cython wrapper.
@@ -464,13 +464,14 @@ class InterpreterGenerator(object):
464
464
  ],
465
465
  ipow_range={{ s.ipow_range }})
466
466
  """), s=s, myself=self, types=types, arg_ch=arg_ch,
467
- indent_lines=indent_lines, the_call=the_call,
468
- the_call_c=the_call_c, do_cleanup=do_cleanup,
469
- warn=AUTOGEN_WARN))
467
+ indent_lines=indent_lines, the_call=the_call,
468
+ the_call_c=the_call_c, do_cleanup=do_cleanup,
469
+ warn=AUTOGEN_WARN))
470
470
 
471
471
  def write_pxd(self, write):
472
472
  r"""
473
473
  Generate the pxd file for the Cython wrapper.
474
+
474
475
  This function calls its write parameter successively with
475
476
  strings; when these strings are concatenated, the result is
476
477
  the code for the pxd file.
@@ -522,7 +523,7 @@ class InterpreterGenerator(object):
522
523
  {{ arg_ch.storage_type.c_reference_type() }} result) except 0
523
524
  {% endif %}
524
525
  """), s=s, myself=self, types=types, indent_lines=indent_lines,
525
- arg_ch=arg_ch, warn=AUTOGEN_WARN))
526
+ arg_ch=arg_ch, warn=AUTOGEN_WARN))
526
527
 
527
528
  def get_interpreter(self):
528
529
  r"""
@@ -186,27 +186,26 @@ class CDFInterpreter(StackInterpreter):
186
186
  result = CDF(py_result)
187
187
  retval[0] = CDE_to_dz(result)
188
188
  return 1
189
-
190
189
  """[1:])
191
190
 
192
191
  instrs = [
193
192
  InstrSpec('load_arg', pg('A[D]', 'S'),
194
- code='o0 = i0;'),
193
+ code='o0 = i0;'),
195
194
  InstrSpec('load_const', pg('C[D]', 'S'),
196
- code='o0 = i0;'),
195
+ code='o0 = i0;'),
197
196
  InstrSpec('return', pg('S', ''),
198
- code='return i0;'),
197
+ code='return i0;'),
199
198
  InstrSpec('py_call', pg('P[D]S@D', 'S'),
200
- uses_error_handler=True,
201
- code="""
199
+ uses_error_handler=True,
200
+ code="""
202
201
  if (!cdf_py_call_helper(i0, n_i1, i1, &o0)) {
203
202
  goto error;
204
203
  }
205
204
  """)
206
205
  ]
207
- for (name, op) in [('add', '+'), ('sub', '-'),
208
- ('mul', '*'), ('div', '/'),
209
- ('truediv', '/')]:
206
+ for name, op in [('add', '+'), ('sub', '-'),
207
+ ('mul', '*'), ('div', '/'),
208
+ ('truediv', '/')]:
210
209
  instrs.append(instr_infix(name, pg('SS', 'S'), op))
211
210
  instrs.append(instr_funcall_2args('pow', pg('SS', 'S'), 'cpow'))
212
211
  instrs.append(instr_funcall_2args('ipow', pg('SD', 'S'), 'cpow_int'))
@@ -216,8 +215,8 @@ if (!cdf_py_call_helper(i0, n_i1, i1, &o0)) {
216
215
  for name in ['sqrt', 'sin', 'cos', 'tan',
217
216
  'asin', 'acos', 'atan', 'sinh', 'cosh', 'tanh',
218
217
  'asinh', 'acosh', 'atanh', 'exp', 'log']:
219
- instrs.append(instr_unary(name, pg('S', 'S'), "c%s(i0)" % name))
218
+ instrs.append(instr_unary(name, pg('S', 'S'), "c%s(i0)" % name))
220
219
  self.instr_descs = instrs
221
220
  self._set_opcodes()
222
221
  # supported for exponents that fit in an int
223
- self.ipow_range = (int(-2**31), int(2**31-1))
222
+ self.ipow_range = (int(-2**31), int(2**31 - 1))
@@ -129,5 +129,4 @@ class ElementInterpreter(PythonInterpreter):
129
129
  return v_el
130
130
 
131
131
  return parent(v)
132
-
133
132
  """[1:])
@@ -250,15 +250,15 @@ class PythonInterpreter(StackInterpreter):
250
250
 
251
251
  instrs = [
252
252
  InstrSpec('load_arg', pg('A[D]', 'S'),
253
- code='o0 = i0; Py_INCREF(o0);'),
253
+ code='o0 = i0; Py_INCREF(o0);'),
254
254
  InstrSpec('load_const', pg('C[D]', 'S'),
255
- code='o0 = i0; Py_INCREF(o0);'),
255
+ code='o0 = i0; Py_INCREF(o0);'),
256
256
  InstrSpec('return', pg('S', ''),
257
- code='return i0;',
258
- handles_own_decref=True),
257
+ code='return i0;',
258
+ handles_own_decref=True),
259
259
  InstrSpec('py_call', pg('C[D]S@D', 'S'),
260
- handles_own_decref=True,
261
- code=ri(0, """
260
+ handles_own_decref=True,
261
+ code=ri(0, """
262
262
  PyObject *py_args = PyTuple_New(n_i1);
263
263
  if (py_args == NULL) goto error;
264
264
  int i;
@@ -167,7 +167,6 @@ class RRInterpreter(StackInterpreter):
167
167
  mpfr_set(retval, result.value, MPFR_RNDN)
168
168
  return 1
169
169
 
170
-
171
170
  So instructions where you need to interact with Python can
172
171
  call back into Cython code fairly easily.
173
172
  """
@@ -211,7 +210,6 @@ class RRInterpreter(StackInterpreter):
211
210
  cdef RealNumber result = domain(fn(*py_args))
212
211
  mpfr_set(retval, result.value, MPFR_RNDN)
213
212
  return 1
214
-
215
213
  """)
216
214
 
217
215
  instrs = [
@@ -104,8 +104,7 @@ class sage_build_cython(Command):
104
104
  ('force', 'force')]
105
105
 
106
106
  # Python 3.5 now has a parallel option as well
107
- if sys.version_info[:2] >= (3, 5):
108
- inherit_opts.append(('parallel', 'parallel'))
107
+ inherit_opts.append(('parallel', 'parallel'))
109
108
 
110
109
  self.set_undefined_options('build_ext', *inherit_opts)
111
110
 
@@ -13,7 +13,7 @@ Utility functions for building Sage
13
13
  # ****************************************************************************
14
14
 
15
15
 
16
- def stable_uniq(L):
16
+ def stable_uniq(L) -> list:
17
17
  """
18
18
  Given an iterable L, remove duplicate items from L by keeping only
19
19
  the last occurrence of any item.
@@ -32,7 +32,7 @@ def stable_uniq(L):
32
32
  return sorted(D, key=lambda item: D[item])
33
33
 
34
34
 
35
- def have_module(name):
35
+ def have_module(name) -> bool:
36
36
  """
37
37
  Check whether a Python module named ``name`` can be imported.
38
38
 
@@ -1 +0,0 @@
1
- 10.5.42