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 ...
ね、簡単でしょう(ニッコリ)