为什么Python中没有'const'?

Vor*_*rac 37 python const const-correctness

我来自C背景,正在学习Python.缺乏明确的类型安全性是令人不安的,但我已经习惯了.面对动态语言的所有优点,缺乏内置的基于合同的编程(纯抽象类,接口)是习惯的东西.

然而,无法请求const-cortectness让我发疯!为什么Python中没有常量?为什么不鼓励类级常量

Syl*_*oux 22

C和Python属于两种不同的语言.

前一个是静态类型.后者是动态的.

在静态类型语言中,类型检查器能够推断每个表达式的类型,并在"编译"阶段检查它是否与给定的声明匹配.

在动态类型语言中,所需的类型信息在运行时才可用.并且表达式的类型可能因一次运行而异.当然,您可以在程序执行期间添加类型检查.这不是 Python的选择.这有利于允许"鸭子打字".缺点是解释器无法检查类型的正确性.

关于const关键字.这是一个类型修饰符.限制允许使用变量(有时修改允许的编译器优化).在运行时检查动态语言似乎效率很低.首先分析,这意味着要检查变量是否为每个符号的常量.这可以进行优化,但即便如此,它是否值得获益?

除技术方面外,不要忘记每种语言都有自己的理念.在Python中,通常的选择是支持"约定"而不是"限制".例如,常量应拼写在所有大写字母中.没有技术执法.这只是一个惯例.如果您遵循它,您的程序将按照"其他程序员"的预期运行.如果您决定修改"常量",Python不会抱怨.但应该觉得你做的"做错了".你打破了一个惯例.也许你有理由这样做.也许你不应该.你的责任.

最后要注意的是,在动态语言中,程序的"正确性"更多地是单元测试的责任,而不是编译器的责任.如果你真的有困难迈出这一步,你会发现一些"代码检查器".那些是PyLint,PyChecker,PyFlakes ......

  • 动态编程没有限制.我应该能够轻松地定义(const x):它基本上是"python中的另一个问题: (9认同)
  • 我同意Erik Aronesty - 在许多情况下,可以在"编译"时检查const合规性.应该可以保证变量不会在某个上下文中直接修改,即使它的类型仅在运行时确定. (4认同)
  • @SylvainLeroux是的,但是水密的污点分析可能超出了此处的建议.适度备选方案是在该在一个变量声明为恒定没有行代码的给定范围修改变量或将其与非恒定变量(例如,通过函数调用)相关联的编译时间的检查.类似于C++提供的安全级别的东西.无需将每个变量跟踪到每个可能的结果. (3认同)
  • @ user3204459 正确。如果你只考虑那个简单的模型,它可以像你提到的那样实现。但这意味着您必须以某种方式将参数的 const 状态存储在编译文件中,以便与预编译库(名称修改?)一起正常工作。即便如此,它真的能确保常量正确性吗?\*args 和 \*\*kwargs,或者通过存储在变量或集合(“函数指针”)中的函数对象的名称动态调用函数呢?也许我错了,但我认为即使使用您的简单模型,您仍然需要*运行时*常量检查。 (3认同)
  • @ user3204459我不会争辩,因为我不专注于那个领域,但你的建议强烈提醒我有关污染的分析来检查和传播变量的可能修改.使用静态分析,这被证明是[不可判定的](https://en.wikipedia.org/wiki/Decision_problem).另一方面,您可以添加一些运行时检查,但是有明显的开销.第三种方式,也许是我最喜欢的方式,是使每一个数据*不可变*. (2认同)
  • 即使在 JS(来自 EcmaScript 2016)中,我们也有常量。希望python也能收到这个功能。如果变量不是常量,我们如何确定变量:) (2认同)
  • 这个答案没有任何意义。将值定义为变量或常量主要是为了数据安全(并避免错误),而不是为了编译器。任何心理体操都不能成为 Python 中缺少 const 的借口。这只是 Python 的一个缺点。 (2认同)