from qux.bar import Baz def some_fn(arg=Baz): # Something involving arg() pass
test_foo.py (running under pytest, with pytest-mock):
from .foo import some_fn def test_some_fn(mocker): mocker.patch('foo.Baz') # Oh no, tests don't mock it out right!
It took me a tick to realize that the function definition was being evaluated at import time, including the values for the kwargs. Even though the body, of course, wasn’t being evaluated. I solved it with this change to
from qux.bar import Baz def some_fn(arg=None): if arg is None: arg = Baz # Something involving arg() pass
This is related to the thing where you never write a function signature with
 in it, because you’ll create an instance at evaluation time that’s shared among all the calls to that function.