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)

アプリケーションのコアが動作するようになったので、より多くの機能を作成する前に、愚かで次善のコードをクリーンアップしたいと考えていました.1つの問題はこれら3つの機能にあります-日付の目的が何であるかを明確に理解していません. (obj) 関数であるため、それらすべてを 1 つの関数に簡単に結合することはできません。どんなアドバイスでも大歓迎です!

4

2 に答える 2

1

を使用date.isoformat()すると、Riak で日付を処理する方法である ISO8601 形式の日付文字列が返されます。日付文字列は、map/reduce 中に JavaScript で Date オブジェクトに戻すか、reduce フェーズで文字列として単純に並べ替えることができます。

のデフォルト パラメータを使用している場合は、json.dumps()必ず Martijn Pieters の例に従い、オブジェクトにプロパティがない場合に a を発生させる必要がTypeErrorあります。isoformat()DateDateTime

于 2013-01-22T21:19:46.457 に答える
1

関数は、関数の関数dateとして使用されます。この関数は、JSON が処理方法を知らない型に対して呼び出されます。defaultdumps

JSON 標準は、数値、文字列、ブール値、null (Python では None)、オブジェクト (Python では dict)、およびリストについてのみ認識します。その限られた型のセット以外のものを処理したい場合は、その「何か」をそれらの型で表現する必要があります。

はそのdefault()目的で使用されます。JSON にそのままシリアライズできないオブジェクトに対して呼び出されます。datetimeオブジェクトはそのようなタイプの 1 つです。にdatetimeオブジェクトを渡すとjson.dumps()default関数はシリアル化可能なバージョンを作成するように求められます。

obj変換方法がわからない型を返すのは正しい方法ではないことに注意してください。代わりに上げTypeErrorます:

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