summaryrefslogtreecommitdiff
path: root/mock.py
diff options
context:
space:
mode:
authorMichael Foord <michael@voidspace.org.uk>2011-10-29 02:13:37 +0100
committerMichael Foord <michael@voidspace.org.uk>2011-10-29 02:13:37 +0100
commite5691efb46d776fbe55a25b4c31f4616a96f6cb1 (patch)
tree99ead57104b2a93707b9a4cb2a76a75012db70ab /mock.py
parent8547d9127e672aa1adab8748dccdc029b1306cdc (diff)
downloadmock-e5691efb46d776fbe55a25b4c31f4616a96f6cb1.tar.gz
Further performance improvements instantiating MagicMock
Diffstat (limited to 'mock.py')
-rw-r--r--mock.py40
1 files changed, 22 insertions, 18 deletions
diff --git a/mock.py b/mock.py
index cc4fb0b..e32bb4e 100644
--- a/mock.py
+++ b/mock.py
@@ -1775,10 +1775,10 @@ def _set_return_value(mock, method, name):
class MagicMixin(object):
def __init__(self, *args, **kw):
_super(MagicMixin, self).__init__(*args, **kw)
- self._mock_set_magics()
+ self._mock_set_magics(_first=True)
- def _mock_set_magics(self):
+ def _mock_set_magics(self, _first=False):
these_magics = _magics
if self._mock_methods is not None:
@@ -1791,10 +1791,12 @@ class MagicMixin(object):
# remove unneeded magic methods
delattr(self, entry)
- existing = set(type(self).__dict__)
- # don't overwrite existing attributes if called a second time
- for entry in these_magics - existing:
- setattr(self, entry, _create_proxy(entry, self))
+ if not _first:
+ # don't overwrite existing attributes if called a second time
+ these_magics = these_magics - set(type(self).__dict__)
+
+ for entry in these_magics:
+ setattr(type(self), entry, MagicProxy(entry, self))
@@ -1833,23 +1835,25 @@ class MagicMock(MagicMixin, Mock):
-def _create_proxy(entry, self):
- # could specify parent?
- def create_mock():
- m = self._get_child_mock(name=entry, _new_name=entry, _new_parent=self)
- setattr(self, entry, m)
- _set_return_value(self, m, entry)
- return m
- return MagicProxy(create_mock)
-
+class MagicProxy(object):
+ __slots__ = ['name', 'parent']
+ def __init__(self, name, parent):
+ self.name = name
+ self.parent = parent
+ def create_mock(self):
+ parent = self.parent
+ entry = self.name
+ m = parent._get_child_mock(name=entry, _new_name=entry,
+ _new_parent=parent)
+ setattr(parent, entry, m)
+ _set_return_value(parent, m, entry)
+ return m
-class MagicProxy(object):
- def __init__(self, create_mock):
- self.create_mock = create_mock
def __call__(self, *args, **kwargs):
m = self.create_mock()
return m(*args, **kwargs)
+
def __get__(self, obj, _type=None):
return self.create_mock()