2007-07-23

雑談。

「トランスフォーマー」見たいです。あなたは?(ここまで挨拶) 筋とかは(監督がアレなので)期待してなくて、ロボット。テレビアニメを見てたのはたしか小学校低学年の頃だったと思うけど、好きだった。これとか「ナイトライダー」とか、そのころから洋ものドラマが好きだった。そういう元少年ばっかり見に行くんだろうな。

「トランスフォーマー」は、しばらくしたら日本製アニメテイストのシリーズ(ヘッドマスターズ)に変わってしまって、そしたら見なくなった(笑)。子供心に洋ものテイストが抜けたのを察知して、激しく違和感を抱いたのを覚えてます。ということは、ロボットとかストーリーとかじゃなくて、おもに海外もののそういうなにかを期待して見ていたわけで、そのころからひねくれた視聴者だったようです。でも人によってなにを面白いと思うかは自由だからね。

Python のデフォルト引数での注意点について。

こんなコードがあったとします。

def foo(d={}, **kwds):
    d.update(kwds)
    print d

foo(a=1, b=2)
foo(x=1, y=2)

これで表示される二行の出力が予測できますか? これはこのようになる。

{'a': 1, 'b': 2}
{'a': 1, 'y': 2, 'b': 2, 'x': 1}

ちゃんと予測できた人はこの先は読む必要はありません。かたや二行目が予想外だった人は要注意。

しかしこれを次のように書き改めてみれば、勘違いする人はいないはず。

_d = {}
def foo(d=_d, **kwds):
    d.update(kwds)
    print d

foo(a=1, b=2)
foo(x=1, y=2)

このように、デフォルト引数の値としてインスタンスを渡していると思わぬ結果にはまることがある。

この場合なら、一例として次のようにすればよい。

def foo(d=None, **kwds):
    if d:
        d = dict(d)
    else:
        d = {}
    d.update(kwds)
    print d

foo(a=1, b=2)
foo(x=1, y=2)

あるいは格好つけるとこうか。

def foo(d=None, **kwds):
    d = dict(d or {}, **kwds)
    print d

foo(a=1, b=2)
foo(x=1, y=2)

実行結果。

{'a': 1, 'b': 2}
{'y': 2, 'x': 1}