Consider loosening restrictions of `Final`
还没有人认领这个 Issue。
- 主要语言
- Python
- 星标
- 1.8k
- 派生
- 302
- 平均合并
- 23 小时
- 30 天内合并 PR
- 8
描述
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.
贡献指南
这个仓库没有索引到贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
调研方向
没有指定文件或测试。首先查看当前的 Final 规则以及 issue 中引用的 PEP 段落,然后阅读评论线程,了解之前提出的反对意见。完成的标准是:对拆分赋值、循环声明和函数参数注解作出明确决定,并将接受的行为记录在相关的 typing 规范中。
由索引模型根据 Issue 内容生成。
评估
- 技术栈
- python
- 领域
- tooling
- Issue 类型
- 功能
- 难度
- 5/5
- 预计耗时
- 一周以上
- 活跃度
- 停滞
- 描述清晰度
- 基本清楚
- 新手友好度
- 25/100