Login | Register For Free | Help
Search for: (Advanced)

Mailing List Archive: Python: Python

Question about creating dictionary like objects

 

 

Python python RSS feed   Index | Next | Previous | View Threaded


bowman.joseph at gmail

Nov 6, 2009, 2:06 PM

Post #1 of 2 (147 views)
Permalink
Question about creating dictionary like objects

I'm working on a memcached based session library, and I've run into an
interesting problem.

Here's the full code for the session library - http://pastebin.com/m295fdfc2

What I'm doing is using __setitem__ to set an element as a list. When
I call .append() on that list, it appears to be modifying the list in
memory, but not running __setitem__ on the parent in order for the
information to get saved in memcached.

For example, here's a test I wrote in Tornado

class TestHandler(BaseHandler):
def get(self):
session = sessions.Session(req_obj = self)
if "test" in session:
self.write("should be appending")
session["test"].append(datetime.datetime.now())
else:
session["test"] = ["first"]
self.write(str(session))

This should have just "test" in the list on first load (which it
does), the append the datetime object on every refresh, so the list
should keep growing. What I'm seeing is that the datetime does get
appended to the list in the session object that is printed, but the
__setitem__() item is never called, so it never gets updated in
memcached.

Can someone tell me what I'm doing wrong?
--
http://mail.python.org/mailman/listinfo/python-list


clp2 at rebertia

Nov 6, 2009, 2:55 PM

Post #2 of 2 (134 views)
Permalink
Re: Question about creating dictionary like objects [In reply to]

On Fri, Nov 6, 2009 at 2:06 PM, bowman.joseph [at] gmail
<bowman.joseph [at] gmail> wrote:
> I'm working on a memcached based session library, and I've run into an
> interesting problem.
>
> Here's the full code for the session library - http://pastebin.com/m295fdfc2
>
> What I'm doing is using __setitem__ to set an element as a list. When
> I call .append() on that list, it appears to be modifying the list in
> memory, but not running __setitem__ on the parent in order for the
> information to get saved in memcached.

list.append() just appends the item to the list object. That's all it
does *and nothing else*.

It doesn't call __setitem__ on the "parent" object containing the
list; how would it even know about that object to begin with?
(pointers aren't reversible)
With normal containers, there's no need to store modified, mutable
items back in the container: the item got modified in-place, the
reference to it from the container is still valid, so storing it back
would be pointless (sounds like memcached is quirky (but probably
justifiably so) in not having this work).
Perhaps you thought some copying occurs when getting items out of
containers? That's not the case.

Since it sounds like you need to force a __setitem__ call on `session`
to have memcached update its storage, you'll have to do it explicitly.

Change:
session["test"].append(datetime.datetime.now())

To:
#use some name better than "foo" obviously
foo = session["test"] #fetch
foo.append(datetime.datetime.now()) #mutate
session["test"] = foo #store back explicitly so memcached knows there
was a change

Cheers,
Chris
--
http://blog.rebertia.com
--
http://mail.python.org/mailman/listinfo/python-list

Python python RSS feed   Index | Next | Previous | View Threaded
 
 


Interested in having your list archived? Contact Gossamer Threads
 
  Web Applications & Managed Hosting Powered by Gossamer Threads Inc.