Idiomatic tuple element replacement
Dieses Issue hat noch niemand übernommen.
- Vorherrschende Sprache
- Python
- Sterne
- 20.6k
- Forks
- 3.3k
- PR-Merge-Kennzahlen
- PR-Kennzahlen ausstehend
Beschreibung
Feature
To replace one element within a tuple (returning a modified copy), we're currently forced to write something like this:
from __future__ import annotations
from typing import (
Any,
Dict,
Final,
Tuple,
)
from typing_extensions import (
assert_type,
)
ComplexTuple = Tuple[str, int, str, Dict[Any, Any], Dict[str, Any]]
# (field0, lineno, field2, field3, field4)
def add_to_lineno(ctup: ComplexTuple, lineno_delta: int) -> ComplexTuple:
# we want to represent the index to be replaced in one place, to
# keep things DRY:
index: Final = 1 # s.t. ctup[index] == lineno
left = ctup[:index] # element(s) left of the value being replaced
lineno = ctup[index]
lineno += lineno_delta
lineno_frag = (lineno,)
right = ctup[index:][1:] # elements right of the value being
# replaced
# NOTE: ↑ weird, inefficient phrasing of 'ctup[index+1:]'
ret = left + lineno_frag + right
return ret
Note the very odd phrasing of right = ... at line 27; this serves to work around incomplete #11990 (which appears to be stale).
It took me quite a while to identify this work-around; I'm sure others would struggle with the same issue.
Pitch
In my opinion, there would be value in doing one of the following:
- document
namedtuple._replace()as the preferred work-around for this case, in a way that aids discovery - (ideally) implement a subset of proposal #11990, specifically focused on basic arithmetic support for
Literals with exactly one, integer value - implement a function to idiomatically replace elements of a tuple (that isn't a
namedtuple)
Notes
I apologize if a "feature" isn't the right venue for discussing this.
This builds on #3078.
Beitragsleitfaden
Erste Schritte
- Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
- Forke das Repository und arbeite in einem Branch.
- Öffne einen Pull Request, der die Issue-Nummer nennt.
Rechercherichtung
Das Issue nennt keine Quelldatei, keinen Test und keinen Einstiegspunkt. Beginne mit der Durchsicht der Diskussion rund um #11990 sowie der bestehenden Behandlung von Tupeltypen, Literal-Arithmetik und namedtuple._replace(). Als abgeschlossen sollte gelten, dass ein klar abgegrenzter Ansatz ausgewählt und implementiert wurde und Tests den Ersatz von Tupel-Elementen sowie dessen Typing-Verhalten abdecken.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- python
- Bereich
- tooling
- Issue-Typ
- Feature
- Schwierigkeit
- 5/5
- Geschätzter Aufwand
- Über eine Woche
- Aktivitätsstatus
- Veraltet
- Klarheit
- Muss geklärt werden
- Anfängerfreundlichkeit
- 25/100