You're workflow won't necessarily break. You need to use a tool which
expects type hints for function annotations to cause you any problems. If
you simply don't use such a tool then you will have no problems.
On Sun, Dec 21, 2014, 11:55 Andrew Svetlov
The silly question.
I use python 3 annotations for argument checking.
My assumption is very simple, for
def f(arg: checker): pass
the checker will raise ValueError or TypeError if arg is not correct. I do it by `checker(arg)` call.
I use this in aiozmq rpc (http://aiozmq.readthedocs.org/en/0.5/rpc.html#signature-validation) for example and checkers from trafaret (https://github.com/Deepwalker/trafaret) works fine.
Will proposed change break my workflow?
On Sun, Dec 21, 2014 at 6:53 PM, Guido van Rossum
wrote: On Sat, Dec 20, 2014 at 2:00 PM, Dennis Brakhane < brakhane@googlemail.com> wrote:
Maybe I'm missing something, but wouldn't type hinting as it's defined now break "virtual subclassing" of ABC?
For example, given the following code:
from collections import Sequence
class MySequence: ...
Sequence.register(MySequence)
it seems to me like the following would work:
def foo(bar): if not isinstance(bar, Sequence): raise RuntimeError("Foo can only work with sequences") ...
but when rewritten for static type checking
def foo(bar: Sequence): ....
it would cease to work. At least I don't see a way a static type checker could handle this relaiably (the register call might occur anywhere, after all)
Is this intentional?
Even if this might be more a mypy/implementation question, it should be clear to users of typing.py if they should expect ABCs to break or not
Well, the program will still run fine with CPython, assuming you keep the isinstance() check in your program. The argument declaration does not cause calls with non-Sequence arguments to be rejected, it just guides the static checker (which is a program that you must run separately, in a similar way as a linter -- it is not built into CPython).
The static checker may request the call foo(MySequence()) if it cannot see that MySequence is a Sequence. You have two options there: if you can change the code of MySequence, you should just inherit from Sequence rather than using the register() call; if you cannot change the code of MySequence, you should use a *stub* module which declares that MySequence is a Sequence. You can read up on stub modules in the mypy docs: http://mypy.readthedocs.org/en/latest/basics.html#library-stubs
-- --Guido van Rossum (python.org/~guido)
_______________________________________________ Python-ideas mailing list Python-ideas@python.org https://mail.python.org/mailman/listinfo/python-ideas Code of Conduct: http://python.org/psf/codeofconduct/
-- Thanks, Andrew Svetlov _______________________________________________ Python-ideas mailing list Python-ideas@python.org https://mail.python.org/mailman/listinfo/python-ideas Code of Conduct: http://python.org/psf/codeofconduct/