James Hartley wrote:

> I have implemented the equivalent of "insert if unique" in Python &
> SQLAlchemy to help with data normalization.  However to help minimize the
> number of preliminary SELECT statements needed, it helps to check types
> through calls to isinstance() before getting to the salient code.
> Unfortunately, the code begins to be cluttered with type-checking
> minutiae.
> 
> While researching this problem, I have found potential solutions like the
> following:
> 
> http://stackoverflow.com/questions/9305751/force-python-class-member-variable-to-be-specific-type
> 
> ...but given that Python 3.5 has syntactically understands gradual typing,
> I have wondered whether addition of this feature offers anything over use
> of property() as described above.  Toy examples have not revealed anything
> useful on this front:
> 
> $ cat example.py
> #!/usr/bin/env python
> 
> class Foobar():
>     def __init__(self, value):
>         self.value = value
> 
> def f(s: str) -> int:
>     print(s)
>     return 3.14
> 
> def main():
>     i = f('foobar')
>     print(type(i))
>     print('i = "{}"'.format(i))
>     i = f(Foobar(3))
>     print(type(i))
>     print('i = "{}"'.format(i))
> 
> if __name__ == '__main__':
>     main()
> $ python example.py
> foobar
> <class 'float'>
> i = "3.14"
> <__main__.Foobar object at 0x85b8aaac>
> <class 'float'>
> i = "3.14"
> $
> 
> I understand that gradual typing may be useful with static analysis, but I
> don't see that any type enforcement occurs by default at runtime.  Am I
> missing something here?   Is there a better solution for type enforcement?

Quoting <https://www.python.org/dev/peps/pep-0484>:

"""
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. Essentially, such a type checker acts as a very 
powerful linter
"""

You need an external tool

http://mypy-lang.org/

to perform a type check:

(mypylang)$ mypy example.py
example.py: note: In function "f":
example.py:9: error: Incompatible return value type (got "float", expected 
"int")
(mypylang)$



_______________________________________________
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
https://mail.python.org/mailman/listinfo/tutor

Reply via email to