Hacktoberfest 2026 : les issues que les mainteneurs ont marquées pour octobre, ouvertes et accessibles aux débutants. Parcourir les issues Hacktoberfest

[Bug]: `complex(real, imag)` converts `imag` before rejecting a non-number `real`

Ouverte Adaptée aux débutants
#1,225 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Les mainteneurs répondent en général sous 1 jour

@jseop-lim y travaille déjà.

Depuis le 20/10/2026.

  • #1230 par @jseop-lim — ouverte

Évaluation

Difficulté
2/5
Temps estimé
1-3 heures
Accessibilité débutants
78/100
Type d'issue
Bug
Clarté
Clairement spécifiée
Activité
Active
Stack technique
java, python
Domaine
backend

Piste de recherche

Lisez ComplexBuiltins.java, en particulier complexFromComplexObject autour des lignes citées et complexFromComplexLong pour les vérifications d’arguments existantes. Reproduisez le problème avec l’exemple Python fourni, puis exécutez les tests pertinents du constructeur complex. Le travail est terminé lorsque real invalide est rejeté avant la conversion de imag, conformément à l’erreur et à l’ordre de conversion de CPython.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Description

bug
Describe the bug

When imag is a user object, complex(real, imag) calls its __float__ or __index__ before checking that real is a number. An exception from that conversion replaces the TypeError CPython raises for the first argument, and CPython never calls the method at all.

Operating system

Linux

CPU architecture

ARM64

GraalPy version

25.0.2 (Python 3.12.8); also reproduced on 25.4.4.1.1 (Python 3.13.14)

JDK version

No response

Context configuration

No response

Steps to reproduce
class RaisingFloat:
    def __float__(self):
        raise Exception()

complex({}, RaisingFloat())

GraalPy 25.0.2 raises the Exception from RaisingFloat.__float__:

Exception
Expected behavior

CPython 3.12.13 (same on 3.13.16):

TypeError: complex() first argument must be a string or a number, not 'dict'
Stack trace

Additional context

The conversion order is reversed too: with both arguments defining a raising __float__, GraalPy calls only imag.__float__ and CPython calls only real.__float__. When imag is an int or float, another specialization checks real first, so complex({1: 2}, 0) already matches CPython.

Root Cause

ComplexNewNode.complexFromComplexObject, taken when imag is neither complex nor a string, converts two at ComplexBuiltins.java#L621-L622 and only then checks one (#L623-L630). CPython's complex_new_impl checks the type of real and then imag (complexobject.c#L945-L972) before converting either (#L995, #L1018).

Fix Suggestion

Reorder complexFromComplexObject to raise the first-argument error, then the second-argument error, and only then convert one and two, as complexFromComplexLong (#L532-L539) already checks one first.

Langage dominant
Python
Étoiles
1.7k
Forks
158
Merge moyen
8 h 58 min
PR mergées (30 j)
44

Préparer son environnement

Ouvrir dans Codespaces

Lance le conteneur de développement du projet dans votre navigateur, avec votre propre compte GitHub.

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Autres issues de oracle/graalpython

Toutes les issues de oracle/graalpython

Issues similaires

Plus d'issues Python

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.