Consider loosening restrictions of `Final`
Dieses Issue hat noch niemand übernommen.
Bewertung
- Schwierigkeit
- 5/5
- Geschätzter Aufwand
- Über eine Woche
- Anfängerfreundlichkeit
- 25/100
Rechercherichtung
Es werden keine Dateien oder Tests genannt. Beginne damit, die aktuellen Final-Regeln und die in der Issue zitierten PEP-Passagen zu prüfen, und lies dann den Kommentar-Thread zu früheren Einwänden. Als abgeschlossen gilt die Arbeit, wenn eine klare Entscheidung zu Split-Zuweisungen, Schleifendeklarationen und Annotationen von Funktionsargumenten getroffen und das akzeptierte Verhalten in der relevanten typing-Spezifikation festgehalten wurde.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Beschreibung
I think that Final is a very based idea, but I feel that it's current restrictions make using it painful.
I think that split assignments should be allowed:
def foo(cond: bool) -> None:
if cond:
a: Final = Funny("spam")
else:
a: Final = Funny("eggs") # this is currently an error
Most languages allow this pattern to initialize constant variables:
def foo(cond: bool) -> None:
a: Final[Funny]
if cond:
a = Funny("spam")
else:
a = Funny("eggs")
I think these are convenient and enables Final to be used in more scenarios, but this is currently an error.
But this is allowed:
def foo(cond: bool) -> None:
a: Final = Funny("spam") if cond else Funny("eggs")
Another issue I've found is the prohibition of Final declarations within loops:
def foo() -> None:
for i in [1,2,3]:
a: Final = i * 2 # currently an error
a = 10 # error
print(a)
print(a)
a = 10 # error
This is defined in the pep:
Note that a type checker need not allow Final declarations inside loops since the runtime will see multiple assignments to the same variable in subsequent iterations.
I understand that at runtime the same variable is reused for each iteration of the loop, but if you ignore that fact and just look at the semantic meaning of the code, it matches exactly to this Kotlin example:
fun foo() {
val a = listOf(1, 2, 3).map { i ->
val a = i
a = 10 // error
println(a)
a
}.last()
println(a)
a = 10 // error
}
Disallowing Final in loops doesn't address any of the motivations listed in the pep, any I can't see any reason why it should be disallowed.
Also, why are Final annotations not allowed on functional arguments?
Finalmay only be used as the outermost type in assignments or variable annotations. Using it in any other position is an error. In particular,Finalcan't be used in annotations for function arguments:
Why? This is commonly seen in other languages. In Kotlin, function parameters can only be val(Kotlin's form of Final), in Java a function parameter may be marked with final.
- Vorherrschende Sprache
- Python
- Sterne
- 1.8k
- Forks
- 302
- Ø Merge
- 23 Std.
- Gemergte PRs (30 T.)
- 8
Beitragsleitfaden
Für dieses Repository ist kein Beitragsleitfaden indexiert
Erste Schritte
- Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
- Forken Sie das Repository und arbeiten Sie in einem Branch.
- Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.
Mehr aus python/typing
-
topic: typing spec
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 72/100
-
topic: typing spec
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 75/100
-
topic: documentation
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 76/100
-
topic: documentation
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 65/100
-
topic: conformance tests topic: typing spec
Schwierigkeit 3/5 1-2 Tage Anfängerfreundlichkeit 72/100
Ähnliche Issues
-
area: harness bug status: needs-triage
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 75/100
Human-Agent-Society/reef#625 ·
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 70/100
-
Schwierigkeit 1/5 Unter einer Stunde Anfängerfreundlichkeit 80/100
learningequality/kolibri#15351 · 2 Kommentare ·
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 75/100
-
Name consistency Offen
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 75/100
eellak/triplestore#65 · 1 Kommentar ·