Question about creating dictionary like objects

Discussion in 'Python' started by bowman.joseph@gmail.com, Nov 6, 2009.

  1. Guest

    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?
     
    , Nov 6, 2009
    #1
    1. Advertising

  2. Chris Rebert Guest

    On Fri, Nov 6, 2009 at 2:06 PM,
    <> 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
     
    Chris Rebert, Nov 6, 2009
    #2
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Patrick Kowalzick
    Replies:
    5
    Views:
    485
    Patrick Kowalzick
    Mar 14, 2006
  2. kgk
    Replies:
    1
    Views:
    305
    Marc 'BlackJack' Rintsch
    Jul 11, 2007
  3. james_027
    Replies:
    1
    Views:
    337
    Marc 'BlackJack' Rintsch
    Aug 22, 2007
  4. William McBrine
    Replies:
    1
    Views:
    473
    Tim Golden
    Mar 16, 2008
  5. RunThePun
    Replies:
    19
    Views:
    808
Loading...

Share This Page