os.mkdir()とos.path.exists()とos.path.join()とかの話

ある特定のディレクトリを掘りたかった

もともと toge というディレクトリにファイルを吐き出すという処理をしていたいところに /hoge/moge/toge みたいに掘りたいという話になった。最初はおれは

def generate_dir(base_dir):
    if os.path.exists(u"ほげ"):
        return base_dir
    return os.mkdir(u"ほげ")

みたいにディレクトリの存在を確認してからなければos.mkdir()するという関数を考えていた

それ os.path.join だけでよくね?という話

擬似コードだけどこれは結局こうした

def generate_dir(base_dir):
    return os.path.join(base_dir, u"ほげ")

で、pathさえ指定してしまえばあとはファイルを吐き出す処理はその生成したpathに対してあげてやれば別にos.path.exists()してos.mkdr()なんて判定いれるより楽だし、ミスもしない。

蛇足

これとは関係ないけど、ある一定の定数をいれるモジュール TEISUU.py というのを定義するとして、そこに定数を定義してやる HOGE には文字列でももちろんいいけど、使えるべきところには dict をつかったほうがいいよね。たとえば

MUSICIAN_ERIC = u"Lsst Date"
MUSICIAN_ABE = u"なしくずしの死"
MUSICIAN_PETER = u"Musine Gun"
def hantei_musician(musician):
    if musician == MUSICIAN_ERIC:
        return ...
...

なんてより、

MUSICIAN = {
    u"Eric Dolphy": u"Last Date",
    u"阿部薫": u"なしくずしの死",
    u"Peter Brotzmann": u"Musine Gun",
}
def haitei_musician(musician):
    musician = MUSICIAN.get(musician)

みたいな。当たり前だけど、こういう当たり前のことに気づけなくてアホなことするところだった。なにより、定数を無駄に増やしたりしないように、また if 文を減らすことで可読性は上がるしなによりテストの時に楽になる。テストを作成するときにいかに楽ができるような関数を書くか、っていうのを観点にいれるといいみたい。それこそ蛇足だけど、Djangoの views.py は request 引数を必ずとるので、 api.py とか rogic.py とかなんでもいいけどモジュールに分けて関数に分けてやるとテストもしやすい。