Michael Foord <mich...@voidspace.org.uk> added the comment:

Spec objects are currently dumb. It would be a new feature to add signature 
validation to them. 

I think it would be a useful feature though as currently autospec sort of 
obsoletes spec objects whilst being more heavyweight and harder to use. 

I think it would appropriate to add to 3.8 but not to 3.7. 

Compatibility with existing tests is the issue. The obvious answer is a flag to 
turn it on/off but that adds complexity to the API. 

My gut feeling is that spec objects are far more commonly used in situations 
where validation would be useful than a detriment. 

> On 31 Mar 2019, at 18:07, Karthikeyan Singaravelan <rep...@bugs.python.org> 
> wrote:
> 
> 
> Karthikeyan Singaravelan <tir.kar...@gmail.com> added the comment:
> 
> I am slightly concerned if spec should gain more responsibility than just 
> validating attribute access which is mentioned in the docs. With the linked 
> PR spec below would also validate the signature which is not done in Python 
> 3.7 so this might break code for someone who only wants to validate access 
> attribute access and not signature of the methods. It seems the PR also adds 
> autospec argument to Mock that is currently not supported though spec and 
> spec_set are supported.
> 
> from unittest import mock
> 
> def foo(lish):
>    pass
> 
> mock_foo = mock.Mock(spec=foo)
> mock_foo(1, 2)
> 
> try:
>    mock_foo.non_existent
> except AttributeError:
>    print("raises AttributeError for non-existent attribute")
> 
> # 3.7
> 
> ➜  cpython git:(pr_1982) python3.7 /tmp/foo.py
> raises AttributeError for non-existent attribute
> 
> # With PR
> 
> ➜  cpython git:(pr_1982) ./python.exe /tmp/foo.py
> Traceback (most recent call last):
>  File "/tmp/foo.py", line 7, in <module>
>    mock_foo(1, 2)
>  File 
> "/Users/karthikeyansingaravelan/stuff/python/cpython/Lib/unittest/mock.py", 
> line 1009, in __call__
>    _mock_self._mock_check_sig(*args, **kwargs)
>  File 
> "/Users/karthikeyansingaravelan/stuff/python/cpython/Lib/unittest/mock.py", 
> line 103, in checksig
>    sig.bind(*args, **kwargs)
>  File "/Users/karthikeyansingaravelan/stuff/python/cpython/Lib/inspect.py", 
> line 3016, in bind
>    return args[0]._bind(args[1:], kwargs)
>  File "/Users/karthikeyansingaravelan/stuff/python/cpython/Lib/inspect.py", 
> line 2937, in _bind
>    raise TypeError('too many positional arguments') from None
> TypeError: too many positional arguments
> 
> ----------
> 
> _______________________________________
> Python tracker <rep...@bugs.python.org>
> <https://bugs.python.org/issue30587>
> _______________________________________

----------

_______________________________________
Python tracker <rep...@bugs.python.org>
<https://bugs.python.org/issue30587>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to