0

我一直在为自己做一个小项目,我使用 riak、python 和 flask 框架。像在大多数情况下一样,我想存储存储在 riak 中的对象的创建日期,以及其他一些日期(如会话到期日期)。当我第一次尝试只存储日期对象时,我遇到了一个错误,解决方案是使用如下代码:

def date(obj):
    return obj.isoformat() if hasattr(obj, 'isoformat') else obj


def json_date():
    return json.dumps(datetime.now(), default=date)

我已经测试过它,并且很高兴地使用它,但后来我遇到了一些更复杂的需求,即 N 分钟后的会话到期日期,所以我很快写了这样的东西:

def json_session_expiration_date():
    return json.dumps(datetime.now() + timedelta(minutes=15), default=date)

现在我的应用程序的核心已经工作了,我想在开始编写更多功能之前清理愚蠢和次优的代码,我遇到的一个问题是这三个功能 - 我不清楚日期的目标是什么(obj) 函数,因此我不能轻松地将它们全部加入一个函数中。任何建议表示赞赏!

4

2 回答 2

1

Usingdate.isoformat()将返回 ISO8601 格式的日期字符串,这是在 Riak 中处理日期的方式。然后可以在 map/reduce 期间将日期字符串转换回 javascript 中的 Date 对象,或者在 reduce 阶段简单地排序为字符串。

如果您使用默认参数,json.dumps()您当然应该遵循 Martijn Pieters 示例并TypeError在对象不具有isoformat()属性时引发 a - 只有DateandDateTime对象将具有该属性。

于 2013-01-22T21:19:46.457 回答
1

date函数用作default函数的dumps函数;对于 JSON 不知道如何处理的任何类型,都会调用该函数。

JSON 标准只知道数字、字符串、布尔值、空值(python 中的 None)、对象(python 中的字典)和列表。如果您想处理该有限类型集之外的任何内容,则需要根据这些类型来表达“某事”。

default()用于该目的;任何不能按原样序列化为 JSON 的对象都会调用它。datetime对象就是这样一种类型。当你成为一个datetime对象时json.dumps(),该default函数将被要求创建它的可序列化版本。

请注意,返回obj不是处理您不知道如何转换的类型的正确方法。TypeError改为提高:

def date(obj):
    try:
        return obj.isoformat()
    except AttributeError:
        raise TypeError()
于 2013-01-22T18:01:20.760 回答