0

各キーの 3 要素リストを格納するキャッシュ ディクショナリがあります[value, date_created, hits]。キャッシュ通信は JSON 経由で行われます。itemsキャッシュには、すべてのアイテムを返すコマンドがあります。これは set cache メソッドです。

@status
def handle_set(self, key, value):
    self.data[key] = [value, datetime.datetime.now(), 0]
    return

空でないキャッシュがあり、それを呼び出すと、問題が発生しitemsます。Python の datetime オブジェクトはシリアル化できません:

Traceback (most recent call last):
  File "/usr/lib/python2.7/dist-packages/twisted/python/log.py", line 84, in callWithLogger
    return callWithContext({"system": lp}, func, *args, **kw)
  File "/usr/lib/python2.7/dist-packages/twisted/python/log.py", line 69, in callWithContext
    return context.call({ILogContext: newCtx}, func, *args, **kw)
  File "/usr/lib/python2.7/dist-packages/twisted/python/context.py", line 118, in callWithContext
    return self.currentContext().callWithContext(ctx, func, *args, **kw)
  File "/usr/lib/python2.7/dist-packages/twisted/python/context.py", line 81, in callWithContext
    return func(*args,**kw)
--- <exception caught here> ---
  File "/usr/lib/python2.7/dist-packages/twisted/internet/selectreactor.py", line 146, in _doReadOrWrite
    why = getattr(selectable, method)()
  File "/usr/lib/python2.7/dist-packages/twisted/internet/tcp.py", line 460, in doRead
    rval = self.protocol.dataReceived(data)
  File "./server.py", line 17, in dataReceived
    result = getattr(self.factory, command)(**request)
  File "./server.py", line 35, in execute
    return json.dumps(result)
  File "/usr/lib/python2.7/json/__init__.py", line 231, in dumps
    return _default_encoder.encode(obj)
  File "/usr/lib/python2.7/json/encoder.py", line 201, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/usr/lib/python2.7/json/encoder.py", line 264, in iterencode
    return _iterencode(o, 0)
  File "/usr/lib/python2.7/json/encoder.py", line 178, in default
    raise TypeError(repr(o) + " is not JSON serializable")
exceptions.TypeError: datetime.datetime(2013, 10, 26, 11, 38, 42, 348094) is not JSON serializable

同様のSO questionを見つけました。しかし、受け入れられた回答で気に入らないのは、カスタムシリアライザーを提供する必要があることです。

私のキャッシュにはさまざまなコマンドがありますが、すべてのキャッシュ コマンドに対して 1 つの JSON 形式のメソッドを使用したいと考えています。その答えに従うとしたら、if-cascadeをしなければならないのではないかと心配しています。

datetime.datetimeJSONシリアライザーで使用される1つの単純なメソッドを提供するためにオーバーライドする方法はありますか? または、これに対するより良い解決策はありますか?

str(d)datetime.datetime JSON シリアライゼーションは、私の場合と同じくらい単純です (文字列表現)。

4

1 に答える 1