numpy fails to build with Python 3.9.0a3. ________________________ TestMatmul.test_matmul_object _________________________ self = <numpy.core.tests.test_multiarray.TestMatmul object at 0x7ff9bc008ca0> def test_matmul_object(self): import fractions f = np.vectorize(fractions.Fraction) def random_ints(): return np.random.randint(1, 1000, size=(10, 3, 3)) > M1 = f(random_ints(), random_ints()) f = <numpy.vectorize object at 0x7ff9bc6751f0> fractions = <module 'fractions' from '/usr/lib64/python3.9/fractions.py'> random_ints = <function TestMatmul.test_matmul_object.<locals>.random_ints at 0x7ff9bcc2d700> self = <numpy.core.tests.test_multiarray.TestMatmul object at 0x7ff9bc008ca0> numpy/core/tests/test_multiarray.py:6259: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ numpy/lib/function_base.py:2091: in __call__ return self._vectorize_call(func=func, args=vargs) numpy/lib/function_base.py:2161: in _vectorize_call ufunc, otypes = self._get_ufunc_and_otypes(func=func, args=args) numpy/lib/function_base.py:2121: in _get_ufunc_and_otypes outputs = func(*inputs) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ cls = <class 'fractions.Fraction'>, numerator = 483, denominator = 809 def __new__(cls, numerator=0, denominator=None, *, _normalize=True): """Constructs a Rational. Takes a string like '3/2' or '1.5', another Rational instance, a numerator/denominator pair, or a float. Examples -------- >>> Fraction(10, -8) Fraction(-5, 4) >>> Fraction(Fraction(1, 7), 5) Fraction(1, 35) >>> Fraction(Fraction(1, 7), Fraction(2, 3)) Fraction(3, 14) >>> Fraction('314') Fraction(314, 1) >>> Fraction('-35/4') Fraction(-35, 4) >>> Fraction('3.1415') # conversion from numeric string Fraction(6283, 2000) >>> Fraction('-47e-2') # string may include a decimal exponent Fraction(-47, 100) >>> Fraction(1.47) # direct construction from float (exact conversion) Fraction(6620291452234629, 4503599627370496) >>> Fraction(2.25) Fraction(9, 4) >>> Fraction(Decimal('1.47')) Fraction(147, 100) """ self = super(Fraction, cls).__new__(cls) if denominator is None: if type(numerator) is int: self._numerator = numerator self._denominator = 1 return self elif isinstance(numerator, numbers.Rational): self._numerator = numerator.numerator self._denominator = numerator.denominator return self elif isinstance(numerator, (float, Decimal)): # Exact conversion self._numerator, self._denominator = numerator.as_integer_ratio() return self elif isinstance(numerator, str): # Handle construction from strings. m = _RATIONAL_FORMAT.match(numerator) if m is None: raise ValueError('Invalid literal for Fraction: %r' % numerator) numerator = int(m.group('num') or '0') denom = m.group('denom') if denom: denominator = int(denom) else: denominator = 1 decimal = m.group('decimal') if decimal: scale = 10**len(decimal) numerator = numerator * scale + int(decimal) denominator *= scale exp = m.group('exp') if exp: exp = int(exp) if exp >= 0: numerator *= 10**exp else: denominator *= 10**-exp if m.group('sign') == '-': numerator = -numerator else: raise TypeError("argument should be a string " "or a Rational instance") elif type(numerator) is int is type(denominator): pass # *very* normal case elif (isinstance(numerator, numbers.Rational) and isinstance(denominator, numbers.Rational)): numerator, denominator = ( numerator.numerator * denominator.denominator, denominator.numerator * numerator.denominator ) else: raise TypeError("both arguments should be " "Rational instances") if denominator == 0: raise ZeroDivisionError('Fraction(%s, 0)' % numerator) if _normalize: if type(numerator) is int is type(denominator): # *very* normal case g = math.gcd(numerator, denominator) if denominator < 0: g = -g else: > g = _gcd(numerator, denominator) E NameError: name '_gcd' is not defined __class__ = <class 'fractions.Fraction'> _normalize = True cls = <class 'fractions.Fraction'> denominator = 809 numerator = 483 self = <[AttributeError("_numerator") raised in repr()] Fraction object at 0x7ff9bc6753a0> /usr/lib64/python3.9/fractions.py:164: NameError See https://docs.python.org/3.9/whatsnew/3.9.html#removed "fractions.gcd() function has been removed, it was deprecated since Python 3.5 (bpo-22486): use math.gcd() instead." For the build logs, see: https://copr-be.cloud.fedoraproject.org/results/@python/python3.9/fedora-rawhide-x86_64/01208199-numpy/ For all our attempts to build numpy with Python 3.9, see: https://copr.fedorainfracloud.org/coprs/g/python/python3.9/package/numpy/ Testing and mass rebuild of packages is happening in copr. You can follow these instructions to test locally in mock if your package builds with Python 3.9: https://copr.fedorainfracloud.org/coprs/g/python/python3.9/ Let us know here if you have any questions. Python 3.9 will be included in Fedora 33. To make that update smoother, we're building Fedora packages with early pre-releases of Python 3.9. A build failure prevents us from testing all dependent packages (transitive [Build]Requires), so if this package is required a lot, it's important for us to get it fixed soon. We'd appreciate help from the people who know this package best, but if you don't want to work on this now, let us know so we can try to work around it on our side.
This sounds like a regression in https://github.com/python/cpython/pull/18021
This is indeed a regression. Upstream bug has details: https://bugs.python.org/issue39350#msg361104
I'm discussing with Mark Dickinson on Python upstream to decide which approach is the best to fix the issue. Mark proposed https://github.com/python/cpython/pull/18309 and I proposed https://github.com/python/cpython/pull/18375
The python3 package in our copr has been patched with https://github.com/python/cpython/pull/18309 to unblock us. Whatever fix you decide to deploy, please make sure it goes into a4. Possibly mark the issue as a blocker for a4, please.
> The python3 package in our copr has been patched with https://github.com/python/cpython/pull/18309 to unblock us. It should fix numpy as well. We agreed to merge a different fix: https://github.com/python/cpython/commit/dc7a50d73a3d16918529669ff7b8783c08cff090 > Whatever fix you decide to deploy, please make sure it goes into a4. Possibly mark the issue as a blocker for a4, please. Sure, it will land into alpha4 scheduled for Monday, 2020-02-17.
https://copr.fedorainfracloud.org/coprs/g/python/python3.9/package/numpy/ builds successfully, I close the issue.