Karthikeyan Singaravelan <tir.kar...@gmail.com> added the comment:
While working on partials test case failure I found two more cases along the way. 1. When we call create_autospec it calls _get_signature_object that gets the signature for the given parameter. With functools.partial it returns a partial object and hence while getting the signature it returns the signature for the constructor of partial instead of the underlying function passed to functools.partial. I think a check needs to be added to make sure not to use func.__init__ when it's a partial object. 2. When we call create_autospect on a class that has a partialmethod the self parameter is not skipped in the signature and thus it creates a signature with self causing error. The fix would be to handle partialmethod also in _must_skip that determines whether to skip self or not. 3. It also seems that inspect.getfullargspec doesn't work for magic mocks which I hope is now fixed with __signature__ set in my patch To be honest I don't if my getting hacky at this point I will clean up the code in a couple of days and raise a PR for initial feedback. Current changes are at https://github.com/python/cpython/compare/master...tirkarthi:bpo17185. I am adding @mariocj89 to the issue. Sample reproducer : from functools import partial, partialmethod from unittest.mock import create_autospec import inspect def foo(a, b): pass p = partial(foo, 1) m = create_autospec(p) m(1, 2, 3) # passes since signature is set as (*args, **kwargs) the signature of functools.partial constructor. This should throw TypeError under autospec class A: def f(self, a, b): print(a, b) g = partialmethod(f, 1) m = create_autospec(A) m().g(1, 2) # passes since signature is set as (self, b) and self is not skipped in _must_skip thus self=1, b=2. This should throw TypeError under autospec since the valid call is m().g(2) ---------- nosy: +mariocj89 _______________________________________ Python tracker <rep...@bugs.python.org> <https://bugs.python.org/issue17185> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com