9

Python 3.5中的新特性之一是类型提示,其灵感来自mypy

打字:PEP 484 - 打字提示。

我想测试它,但它没有按预期工作。

import typing

class BankAccount:
    def __init__(self, initial_balance: int = 0) -> None:
        self.balance = initial_balance
    def deposit(self, amount: int) -> None:
        self.balance += amount
    def withdraw(self, amount: int) -> None:
        self.balance -= amount
    def overdrawn(self) -> bool:
        return str(self.balance < 0)

my_account = BankAccount(15)
my_account.withdraw(5)
print(type(my_account.overdrawn()))

结果是:

<class 'str'>

我本来期望一个错误,因为我期望 abool作为返回类型。我在 Python 3.5 (docker) 和本地测试了它。我错过了什么,让它发挥作用吗?这种打字在运行时不起作用吗?

4

2 回答 2

14

请参阅您链接到的 PEP 中摘要的第五段:

虽然这些注解在运行时通过常用__annotations__属性可用,但在运行时不会进行类型检查。相反,该提案假设存在一个单独的离线类型检查器,用户可以自愿运行其源代码

于 2015-10-24T09:01:00.380 回答
4

为了获得static检查,请考虑一个类似mypyPEP 484 的项目。

在 PEP中明确声明运行时不会执行任何检查,以减轻对某些过渡到静态外观 Python 的担忧。


正如丹尼尔所指出的,您可以通过__annotations__以下形式查看属性中的属性:

{'return': bool}

对于函数overdrawn()

如果您愿意,您可以创建自己的小型类型检查函数,以利用 this 执行少量运行时检查dict。玩弄它。此外,如果您准备阅读,请在此处查看我对类型提示的回答。

于 2015-10-24T09:07:28.240 回答