我来自C语言,正在学习Python。缺乏显式的类型安全性令人不安,但是我已经习惯了。面对动态语言的所有优点,缺少内置的基于契约的编程(纯抽象类,接口)的不足是必须习惯的。
但是,无法请求const-
cortectness使我疯狂!为什么Python中没有常量?为什么不鼓励使用类级常量?
C和Python属于两种不同的语言类别。
前一个是 静态 类型的。后者是 动态的 。
在静态类型的语言中, 类型检查器 能够推断每个表达式的类型,并在“编译”阶段检查它是否与给定的声明匹配。
在动态类型语言中,所需的类型信息直到运行时才可用。表达式的类型可能因一次运行而异。当然,您可以在程序执行期间添加 类型检查 。这 不是
在Python中做出的选择。这具有允许“鸭式打字”的优点。缺点是解释器无法检查类型正确性。
关于 const 关键字。这是一个 类型修饰符
。限制允许使用的变量(有时修改允许的编译器优化)。在运行时检查动态语言似乎效率很低。在最初的分析中,这将意味着针对每种影响检查一个变量是否为 const
。可以对它进行优化,但是这样做是否值得呢?
除了技术方面,别忘了每种语言都有自己的哲学。在Python中,通常的选择是赞成“约定”而不是“限制”。例如,所有大写字母都应拼写为常数。没有任何技术执行。这只是一个约定。如果您遵循它,您的程序将表现为“其他程序员”所期望的。如果您决定修改“常量”,Python不会抱怨。但是
您 应该感觉自己在做“某些错误”。您违反约定。也许您有这样做的理由。也许你不应该。您的责任。
最后一点,在动态语言中,程序的“正确性”比单元编译器更重要的是单元测试的责任。如果您确实很难做到这一点,那么您会发现一些“代码检查器”。这些是PyLint,PyChecker,PyFlakes
…
问题内容: 众所周知,列表理解 并且有字典理解,例如 但 最终将成为生成器,而不是理解力。这是为什么? 我的猜测是a是不可变的,但这似乎并不是答案。 问题答案: 您可以使用生成器表达式: 但是对于…生成器表达式,已经使用了括号。
问题内容: 为什么在Python中没有and运算符? 问题答案: 不是因为它没有道理;而是因为它没有意义。最好将“ x ++”定义为“ x + = 1,求出x的先前绑定”。 如果您想知道最初的原因,则必须浏览旧的Python邮件列表,或者询问那里的某个人(例如Guido),但是在事实成立之后就很容易找到理由了: 与其他语言一样,不需要简单的增量和减量。您不会经常用Python编写东西。相反,你做类
问题内容: 在Java中,为什么以下代码行不起作用? 如果我将其更改为 起初,我以为您可能没有接口列表,但是我可以创建一个很好的接口。 有想法吗? 问题答案: 泛型类型比较古怪。 表示或任何子类型,但仅表示。如果您想要一个子类型,您需要 我怀疑你可以用 无法执行此操作的原因是,您可以使用对引用的引用,并且必须谨慎使用额外的间接级别。 使用泛型,您可以有两个间接级别,这会给您带来问题,因此它们更容易
问题内容: 另外,在网上可以找到许多创建静态变量的解决方案。(尽管我还没有看到我喜欢的一个。) 为什么Python不支持方法中的静态变量?这被认为是非Python的,还是与Python的语法有关? 编辑: 我专门询问了 为什么 进行设计决策,但我没有提供任何代码示例,因为我想避免解释来模拟静态变量。 问题答案: 忽略这一点的想法是,静态变量仅在以下两种情况下才有用:何时真正应该使用类以及何时真正应
问题内容: 好的,我知道三引号字符串可以用作多行注释。例如, 和 但是从技术上讲,这些是字符串,对吗? 我已经在Google上搜索并阅读了Python样式指南,但无法找到关于为什么没有正式实现多行,/ * * /注释类型的技术答案。我使用三重引号没有问题,但是对于导致这个设计决定的原因我有点好奇。 问题答案: 我怀疑您会得到比“ Guido不需要多行注释”更好的答案。 Guido在推特上发布了以下
问题内容: 我不明白为什么Python没有功能。它有一个内置的(我认为是姐姐),但没有。 在python 2.6中甚至有一个函数(在math中),但是没有符号。当您可以只写一个然后直接从中获取时,为什么还要写一个?后者会更清楚:x带有y的符号,而带copysign的则必须记住它是x带有y的符号还是y带有x的符号! 显然,除了,它不提供任何其他功能,但是它也将更具可读性(对于像python这样的高度