読者です 読者をやめる 読者になる 読者になる

Django の Storage よくわかんないけど無理やり握りつぶして粉砕した話(から、できるだけ例外処理しないロジックをつくりましょうの話)

Django の Storage ってのがあんまりよくわかっていない

とりあえず公式ドキュメントは以下
カスタムのストレージシステムを作成する — Django v1.0 documentation
基本的にはなんかこう OS のファイルシステムみたいな感じにさわれる?まあストレージっていうくらいだからどこかに保存して、 open してなにかこうファイルをよしなにするためのシステムって感じなのは触っていてわかった感じ。Storage には open とか listdir とか copy とかファイルシステムを扱う上での便利メソッドが生えている。

空文字を copy できないっぽい

具体的には擬似コード的にはこんな感じ

copy_settings = []

for hoge in HogeModel.objects.all():
    # これ、 append のほうがいいきがするけどどうなんだろう……
    copy_settings += get_path()

# コピー
for src, dst in copy_settings:
    try:
        # Storage のインスタンス(だとおもう)
        src_storage.copy(
            src,
            dst,
            # これも Storage のインスタンス(だとおもう)
            to_storage=dst_storage,
        )
    except IOError:
        pass

こんな感じであるストレージからあるストレージへコピーするという処理をしていた。ただそのときいろいろ処理をしていた関係で空文字列 u'' が紛れ込んでしまった。空文字だと IOError で落ちるのだ。なのでとりえあず潰した。ああ、綺麗じゃない。行儀が良くない。というかいいロジックな気がしない。例外を raise なり return して吐かないのはすごい美しくない気がするけど、今回はそうもいってられなくて無理やり潰してしまった。

オチ

そんなものはありません。
ストレージまわりむずかしいなぁってのもあるけど、そもそもその内部ロジック(この場合 get_path())が美しくない。もっといい感じにしたかったけど、なんかうまくいかなくて、とりあえず無理やり実装した。はぁ。いいのかなぁ。

ってかいたんだけど!!!!

別にその get_path()のロジック自体である状態の時はスキップするようにしたから別に try except で潰さなくてよくなりました。まる。擬似コード的残すとこんな感じ。

# なんか for でまわすんよ
for hoge in HogeModel.objects.all():
    # なんかそのインスタンスの Path をいれるんよ
    path = hoge.path
    # その path を元にしてパスの名前をつくるんよ
    path_name = generate_path_name(path)
    # このとき コピー対象にならない path_name を None で返してしまえばループから抜け出せるんよ
    if not path_name:
        continue
    ...

ね、簡単でしょう(ニッコリ)