Unpickling"无" Python中的对象

时间:2015-07-06 15:11:48

标签: python redis pickle

我正在使用redis来尝试保存请求的会话对象。基于how to store a complex object in redis (using redis-py),我有:

def get_object_redis(key,r):
    saved = r.get(key)
    obj = pickle.loads(saved)
    return obj

redis = Redis()
s = get_object_redis('saved',redis)

我的情况是没有保存的会话并且已经保存了'评估为None。在这种情况下,我得到:

TypeError: must be string or buffer, not None

最好的解决方法是什么?

1 个答案:

答案 0 :(得分:2)

有几种方法可以解决它。这就是他们的共同点:

def get_object_redis(key,r):
    saved = r.get(key)
    if saved is None:
        # maybe add code here
        return ... # return something you expect
    obj = pickle.loads(saved)
    return obj

如果找不到密钥,您需要清楚地表达您的期望。

版本1
一个例子就是你只返回None:

def get_object_redis(key,r):
    saved = r.get(key)
    if saved is None:
        return None
    obj = pickle.loads(saved)
    return obj

redis = Redis()
s = get_object_redis('saved',redis)
然后

s None。这可能是不好的,因为你需要在某个地方处理它而你不知道它是否被发现或者它是否被发现并且真的None

第2版
您可以根据键创建一个对象,您可以构造该对象,因为您知道键背后的内容。

class KeyWasNotFound(object):
    # just an example class
    # maybe you have something useful in mind
    def __init__(self, key):
        self.key = key

def get_object_redis(key,r):
    saved = r.get(key)
    if saved is None:
        return KeyWasNotFound(key)
    obj = pickle.loads(saved)
    return obj

通常,如果标识很重要,您可以在创建对象后存储该对象,以便为该键返回相同的对象。

版本3
TypeError是一个非常通用的错误。您可以创建自己的错误类。这对我来说是首选的方式,因为我不喜欢版本1,并且不知道哪个对象对返回有用。

class NoRedisObjectFoundForKey(KeyError):
    pass

def get_object_redis(key,r):
    saved = r.get(key)
    if saved is None:
        raise NoRedisObjectFoundForKey(key)
    obj = pickle.loads(saved)
    return obj