One of the new features in Python 3.5 is type-hinting, inspired by mypy.
typing: PEP 484 – Type Hints.
I want to test it, but it does not work as expected.
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()))
results in:
<class 'str'>
I would have expected an error, as I am expecting a bool
as the return type. I tested it on Python 3.5 (docker) and local. Did I miss something, to make it work? Does this typing not work at runtime?
See the fifth paragraph of the abstract in the PEP you link to:
While these annotations are available at runtime through the usual
__annotations__
attribute, no type checking happens at runtime . Instead, the proposal assumes the existence of a separate off-line type checker which users can run over their source code voluntarily
In order to get static
checks, consider a project like mypy
, on which PEP 484 was based on.
No checking will be performed on runtime is explicitly declared in the PEP to ease fears of some transition to a static looking Python.
As Daniel pointed out, you can view the attributes in the __annotations__
attribute in a form of:
{'return': bool}
for function overdrawn()
.
If you want you can create your own small type checking function to perform little runtime checks utilizing this dict
. Play around with it. Additionally, if you're up for the read, take a look at my answer on type hints here.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With