我来自C背景,正在学习Python。缺乏明确的类型安全性令人不安,但我已经习惯了。面对动态语言的所有优点,缺乏内置的基于合同的编程(纯抽象类,接口)是一种习惯。
然而,无法请求constor cortectness让我发疯!为什么Python中没有常量?为什么class-level constants气馁?
答案 0 :(得分:21)
C和Python属于两种不同的语言类别。
前者是静态类型。后者是动态。
在静态类型语言中,类型检查器能够推断每个表达式的类型,并在“编译”阶段检查它是否与给定声明匹配。
在动态类型语言中,所需的类型信息在运行时才可用。并且表达式的类型可能因一次运行而异。当然,您可以在程序执行期间添加类型检查。这是不是在Python中做出的选择。这有利于允许“鸭子打字”。缺点是解释器无法检查类型的正确性。
关于 const 关键字。这是类型修饰符。限制允许使用变量(有时修改允许的编译器优化)。在运行时检查动态语言似乎效率很低。在初步分析时,这意味着检查变量是否为 const 或不是每个做法。这可以优化,但即便如此,它是否值得受益?
除了技术方面,不要忘记每种语言都有自己的哲学。在Python中,通常的选择是支持“约定”而不是“限制”。例如,常量应拼写在所有大写字母中。没有技术执法。这只是一个惯例。如果您遵循它,您的程序将按照“其他程序员”的预期运行。如果您决定修改“常量”,Python不会抱怨。但你应该感觉你做的“做错了什么”。你打破了一个惯例。也许你有理由这样做。也许你不应该。你的责任。
最后要注意的是,在动态语言中,程序的“正确性”更多地是单元测试的责任,而不是编译器的责任。如果你真的有困难迈出这一步,你会发现一些“代码检查器”。这些是PyLint,PyChecker,PyFlakes ...
答案 1 :(得分:4)
我不知道为什么做出这个设计决定,但我个人的猜测是没有明确的const关键字,因为常量的主要好处已经可用:
常量适用于文档目的。如果你看到一个常数,你知道你无法改变它。这也可以通过命名约定来实现。
常量对函数调用很有用。如果将常量作为参数传递给函数,则可以确保它不会更改。在Python中,函数是“按值调用”,但由于python变量是引用,因此您可以有效地传递引用的副本。在函数内部,您可以改变引用,但如果重新分配它,则更改不会在函数范围之外保留。因此,如果将一个数字作为变量传递,它实际上就像“常量”一样传递。您可以为变量分配新值。但在功能之外,你仍然有旧数字
此外,如果有一个const关键字,它会创建一个不对称:变量声明没有关键字,但consts是用关键字声明的。逻辑结果是创建第二个名为var的关键字。这可能是一个品味问题。我个人更喜欢变量声明的简约方法。
如果使用像元组这样的不可变数据结构,你可以实现更多的类型安全性。但是要小心,元组本身不能被修改。但如果它包含对可变对象的引用,即使它们属于元组,它们仍然是可变的。
最后你可能想看看这个片段:http://code.activestate.com/recipes/65207-constants-in-python/?in=user-97991我不确定这是否是“类级别常量”的实现。但我认为它可能有用。