def _maybe_wrap_new(new):
"""If the mock replacement cannot have attributes set on it, wraps it in a function.
Also, if the replacement object is a method, applies the async() decorator.
This is needed so that we support patch(..., x.method) where x.method is an instancemethod
object, because instancemethods do not support attribute assignment.
"""
if new is mock.DEFAULT:
return new
if inspect.isfunction(new) or isinstance(new, (classmethod, staticmethod)):
return asynq(sync_fn=new)(new)
elif not callable(new):
return new
try:
new._maybe_wrap_new_test_attribute = None
del new._maybe_wrap_new_test_attribute
except (AttributeError, TypeError):
# setting something on a bound method raises AttributeError, setting something on a
# Cythonized class raises TypeError
should_wrap = True
else:
should_wrap = False
if should_wrap:
# we can't just use a lambda because that overrides __get__ and creates bound methods we
# don't want, so we make a wrapper class that overrides __call__
class Wrapper(object):
def __call__(self, *args, **kwargs):
return new(*args, **kwargs)
return Wrapper()
else:
return new
评论列表
文章目录