11

我更喜欢 Python 的语法糖;和标准库函数。

但是,我不喜欢的一个功能;是隐式类型。

是否存在具有显式类型的 Python 分布;仍然与例如:PyPi 上的包兼容?

[我正在研究 RPython]

4

5 回答 5

11

从 python 3 开始,使用类型注释的能力被引入到带有PEP 3017的 python 标准中。

快进到 python 3.5 和PEP 0484在此基础上引入类型提示以及模块,该typing模块使人们能够指定变量的类型或函数的返回类型。

from typing import Iterator

def fib(n: int) -> Iterator[int]:
    a, b = 0, 1
    while a < n:
        yield a
        a, b = b, a + b

以上示例取自https://pawelmhm.github.io

根据 484 条注释:

虽然这些注解在运行时通过通常的 __annotations__ 属性可用,但在运行时不会进行类型检查。相反,该提案假设存在一个单独的离线类型检查器,用户可以自愿运行其源代码。本质上,这样的类型检查器充当了一个非常强大的 linter。(虽然个人用户当然可以在运行时使用类似的检查器来执行按合同设计或 JIT 优化,但这些工具还不够成熟。)

tl;博士

尽管 python 提供了这种形式的“静态类型”,但它并没有在运行时强制执行,python 解释器只是忽略您提供的任何类型规范,并且仍然使用鸭子类型来推断类型。因此,您可以自行决定是否找到一个 linter 来检测类型的任何问题。

此外

在 python 标准中包含输入的动机主要受mypy的影响,因此可能值得一试。它们还提供了可能证明有用的示例。

于 2016-08-05T17:43:30.183 回答
5

最简洁的答案是不。您所要求的内容深深地内置于 Python 中,并且如果不彻底改变语言就无法改变,这不会是 Python。

我假设您不喜欢在重新分配时重新键入的变量?如果这是您的代码的问题,您可能会考虑其他方法来检查这一点。

于 2014-03-13T08:00:03.470 回答
1

不,你不能吃蛋糕和吃蛋糕。

Python很棒,因为它是动态类型的!时期。(这就是为什么它也有这么好的标准库)

静态类型语言只有 2 个优点 1) 速度 - 当算法正确开始时和 2) 编译错误

至于1)

  • 使用 PyPi,
  • 轮廓,
  • 使用 ctype 库以获得出色的性能。

通常只有 10% 或更少的代码对性能至关重要。剩下的90%?享受动态类型的优势。

至于2)

  • 使用类(和合同)
  • 使用单元测试
  • 使用重构
  • 使用好的代码编辑器

典型的数据不适合标准数据类型,这些数据类型在允许存储的内容上过于严格或过于松散。确保您自己验证您的数据。

算法测试必须有单元测试,没有编译器可以为你做,并且应该捕获由错误数据类型引起的任何问题(并且与编译器不同,它们的粒度与你需要的一样细)

当您不确定给定的更改是否会破坏您的代码时,重构可以解决所有这些问题(同样,强类型数据也不能保证)。

而好的代码编辑器可以解决这么多的问题……用Sublime Text一会。然后你就会明白我的意思。

(可以肯定的是,我不会给你答案你想拥有。而是我质疑你的需求,尤其是那些你没有包含在你的问题中的需求)

于 2014-03-13T08:01:32.863 回答
1

现在在 2021 年,有一个名为Deal的库,它不仅提供了强大的静态类型检查器,还允许您指定前置条件和后置条件、循环不变量、明确声明对异常和 IO/副作用的期望,甚至正式证明代码的正确性(对于 Python 的一小部分)。

这是他们 GitHub 上的一个示例:

# the result is always non-negative
@deal.post(lambda result: result >= 0)
# the function has no side-effects
@deal.pure
def count(items: List[str], item: str) -> int:
    return items.count(item)

# generate test function
test_count = deal.cases(count)

现在我们可以:

  • 运行python3 -m deal lint或 flake8 以静态检查错误。
  • 运行python3 -m deal test或 pytest 以生成和运行测试。
  • 只需在项目中使用该功能并在运行时检查错误。
于 2021-11-23T23:19:54.613 回答
-1

由于评论有限...

作为一种解释性语言,Python 根据定义是弱类型的。这并不是一件坏事,因为它可以让程序员抢占潜在的语法错误,但实际上这并不会阻止逻辑错误的发生,因此这一点没有实际意义。

尽管关于 RPython 的论文指出了这一点,但它专注于面向对象编程。您必须记住,Python 更像是 OOP 和函数式编程的结合体,可能还有其他的。

我鼓励阅读此页面,它非常有用。

于 2014-03-13T07:48:53.390 回答