summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/orm/state.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/sqlalchemy/orm/state.py')
-rw-r--r--lib/sqlalchemy/orm/state.py58
1 files changed, 29 insertions, 29 deletions
diff --git a/lib/sqlalchemy/orm/state.py b/lib/sqlalchemy/orm/state.py
index 48861085d..392d83d94 100644
--- a/lib/sqlalchemy/orm/state.py
+++ b/lib/sqlalchemy/orm/state.py
@@ -36,10 +36,8 @@ class InstanceState(object):
self.class_ = obj.__class__
self.manager = manager
self.obj = weakref.ref(obj, self._cleanup)
-
- @util.memoized_property
- def committed_state(self):
- return {}
+ self.callables = {}
+ self.committed_state = {}
@util.memoized_property
def parents(self):
@@ -49,10 +47,6 @@ class InstanceState(object):
def pending(self):
return {}
- @util.memoized_property
- def callables(self):
- return {}
-
@property
def has_identity(self):
return bool(self.key)
@@ -75,10 +69,18 @@ class InstanceState(object):
instance_dict.remove(self)
except AssertionError:
pass
+
# remove possible cycles
- self.__dict__.pop('callables', None)
- self.dispose()
-
+ self.callables.clear()
+
+ # inlining of self.dispose()
+ if self.session_id:
+ try:
+ del self.session_id
+ except AttributeError:
+ pass
+ del self.obj
+
def obj(self):
return None
@@ -251,11 +253,8 @@ class InstanceState(object):
else:
filter_deferred = False
- to_clear = (
- self.__dict__.get('pending', None),
- self.__dict__.get('committed_state', None),
- self.mutable_dict
- )
+ pending = self.__dict__.get('pending', None)
+ mutable_dict = self.mutable_dict
for key in attribute_names:
impl = self.manager[key].impl
@@ -264,18 +263,20 @@ class InstanceState(object):
self.callables[key] = self
dict_.pop(key, None)
- for d in to_clear:
- if d is not None:
- d.pop(key, None)
+ self.committed_state.pop(key, None)
+ if mutable_dict:
+ mutable_dict.pop(key, None)
+ if pending:
+ pending.pop(key, None)
- def __call__(self, **kw):
+ def __call__(self, passive):
"""__call__ allows the InstanceState to act as a deferred
callable for loading expired attributes, which is also
serializable (picklable).
"""
- if kw.get('passive') is PASSIVE_NO_FETCH:
+ if passive is PASSIVE_NO_FETCH:
return PASSIVE_NO_RESULT
toload = self.expired_attributes.\
@@ -407,16 +408,15 @@ class InstanceState(object):
if a value was not populated in state.dict.
"""
-
- self.__dict__.pop('committed_state', None)
- self.__dict__.pop('pending', None)
- if 'callables' in self.__dict__:
- callables = self.callables
- for key in list(callables):
- if key in dict_ and callables[key] is self:
- del callables[key]
+ self.committed_state.clear()
+ self.__dict__.pop('pending', None)
+ callables = self.callables
+ for key in list(callables):
+ if key in dict_ and callables[key] is self:
+ del callables[key]
+
for key in self.manager.mutable_attributes:
if key in dict_:
self.committed_state[key] = self.manager[key].impl.copy(dict_[key])