[Bug]: `reversed()` on a dict or dict view returns the forward iterator type instead of `dict_reverse*iterator`
I maintainer di solito rispondono entro 1 giorno
Una pull request collegata è già stata integrata.
- #1228 di @jseop-lim — integrata
Valutazione
- Difficoltà
- 2/5
- Tempo stimato
- 1-3 ore
- Idoneità per principianti
- 78/100
Direzione di ricerca
Inizia in DictBuiltins.java, DictViewBuiltins.java e DictValuesBuiltins.java nei quattro punti reversed indicati nell’issue; segui come le loro factories avvolgono gli iteratori inversi dello storage. Confronta le factories di iteratori esistenti e le classi PDictReverse*Iterator, poi aggiungi test di regressione per reversed(dict), keys, values e items. Il lavoro è completato quando ciascuno restituisce il tipo di iteratore inverso corrispondente e l’ordine di iterazione rimane corretto.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Describe the bug
reversed(d), reversed(d.keys()), reversed(d.values()) and reversed(d.items()) return objects of the forward iterator types (dict_keyiterator and so on). CPython returns dict_reversekeyiterator, dict_reversevalueiterator and dict_reverseitemiterator. GraalPy already defines those three types but never instantiates them.
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
d = {1: 2}
print(type(reversed(d)).__name__)
print(type(reversed(d.keys())).__name__)
print(type(reversed(d.values())).__name__)
print(type(reversed(d.items())).__name__)
GraalPy 25.0.2:
dict_keyiterator
dict_keyiterator
dict_valueiterator
dict_itemiterator
Expected behavior
CPython 3.12.13 (same on 3.13.16):
dict_reversekeyiterator
dict_reversekeyiterator
dict_reversevalueiterator
dict_reverseitemiterator
Stack trace
Additional context
Iteration order is correct; only the type differs, so type(reversed(d)) is type(iter(d)) is True on GraalPy.
For the views this looks like a regression. They returned the reverse types after 8fe0061a78 and switched to the forward factories in afc1f123e6, so 22.3 should still report the reverse names (read from the history, not run). dict.__reversed__ itself has used the forward type since 8fe0061a78.
Root Cause
The __reversed__ nodes of dict (DictBuiltins.java#L439), dict_keys and dict_items (DictViewBuiltins.java#L196, #L206) and dict_values (DictValuesBuiltins.java#L112) wrap the reverse storage iterator with the forward factories createDictKeyIterator, createDictItemIterator and createDictValueIterator. PDictReverseItemIterator, PDictReverseKeyIterator and PDictReverseValueIterator are still defined (PythonBuiltinClassType.java#L424-L430), but no code creates an instance of them. CPython's dict___reversed___impl and the three view __reversed__ functions all pass a PyDictRevIter*_Type to dictiter_new (dictobject.c#L4494, #L5129, #L5235, #L5316).
Fix Suggestion
Add createDictReverse{Key,Item,Value}Iterator factories that build the same Java iterator objects with the PDictReverse*Iterator classes, as before afc1f123e6, and call them from the four sites above. The reverse types could also take disallowInstantiation() like their forward counterparts.
- Lingua principale
- Python
- Stelle
- 1.7k
- Fork
- 163
- Merge medio
- 14h 10m
- PR unite (30g)
- 56
Preparare l'ambiente
Avvia il container di sviluppo del progetto nel browser, con il tuo account GitHub.
- Nessun Dockerfile né file Docker Compose
- Nessun modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di oracle/graalpython
-
[Bug]: sys.flags.debug is 1 whenever optimization is offForse già presa @hippi345 l’ha presa 12 giorni fa. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100
oracle/graalpython#1213 ·
I maintainer di solito rispondono entro 1 giorno
-
bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 74/100
oracle/graalpython#1105 ·
I maintainer di solito rispondono entro 1 giorno
-
bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
oracle/graalpython#1102 ·
I maintainer di solito rispondono entro 1 giorno
-
enhancement
Difficoltà 4/5 3-5 giorni Idoneità per principianti 35/100
oracle/graalpython#1217 ·
I maintainer di solito rispondono entro 1 giorno
-
enhancement
Difficoltà 4/5 3-5 giorni Idoneità per principianti 54/100
oracle/graalpython#1212 ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di oracle/graalpython
Issue simili
-
area/profiles comp/cli P3 type/feature
Difficoltà 2/5 1-3 ore Idoneità per principianti 74/100
NousResearch/hermes-agent#146372 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 65/100
I maintainer di solito rispondono entro 1 giorno
-
[oblt-aw][autodoc] Document obs-aw-automerge contract and fix automerge doc inconsistenciesForse già presa @github-actions l’ha presa oggi. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
I maintainer di solito rispondono entro 1 giorno
-
GeoSeries scale and skew tests fail with pytest 9.2.0Forse già presa @jiayuasu l’ha presa oggi. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
I maintainer di solito rispondono entro 1 giorno
-
admission-deferred priority: medium status: ready work-class: scoped
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
melodic-software/claude-code-plugins#10887 · 4 commenti ·
I maintainer di solito rispondono entro 1 giorno