> An equivalent way to write this in Python 2 is the following:
>
>     def embezzle(self, account, funds=1000000, *fake_receipts):
>         # type: (str, int, *str) -> None
>         """Embezzle funds from account using fake receipts."""
>         <code goes here>

By using comments, the annotations would not be available at
runtime via an .__annotations__ attribute and every tool would
have to implement a parser for extracting them.

Wouldn't it be better and more in line with standard Python
syntax to use decorators to define them ?

    @typehint("(str, int, *str) -> None")
    def embezzle(self, account, funds=1000000, *fake_receipts):
        """Embezzle funds from account using fake receipts."""
        <code goes here>

I really like MAL's variation much better.  Being able to see .__annotations__ at runtime feels like an important feature that we'd give up with the purely comment style.
 

--
Keeping medicines from the bloodstreams of the sick; food
from the bellies of the hungry; books from the hands of the
uneducated; technology from the underdeveloped; and putting
advocates of freedom in prisons.  Intellectual property is
to the 21st century what the slave trade was to the 16th.