あまり良くない書き方 その1 変数名

個人的に、コードはどう書こうが期間内に目的が達成できればそれで良いと考えているのですが、あまりにも考えずに書くと色々思わぬトラブルに見舞われてしまう場合があります。

まずはクイズからです。以下のサンプルコードは実行するとエラーが発生せずにちゃんと動くのですが、どんな危険性をはらんでいるでしょうか?

str = "文字列です"
list = [1, 2, 3]
dict = {'key1': 100, 'key2': 200}

str、list、dictは、組込みの型であり標準関数です。そう、上のコードではそれらが上書きされてしまっているわけですね。

例えば、strという標準関数はオブジェクトの文字列表現を返しますが、上のコードに続けてstrを呼び出すとどうなるでしょうか?

str = "文字列です"
list = [1, 2, 3]
dict = {'key1': 100, 'key2': 200}

num = 100
num_text = str(100)

# Traceback (most recent call last):
#   File "sample.py", line 7, in <module>
#     num_text = str(100)
# TypeError: 'str' object is not callable

str関数がただの文字列となった結果、もともと備わっていた機能が失われてエラーが発生していることが確認できます。

pythonではクラスや関数もただのオブジェクトに過ぎないので、普通のオブジェクトと同様に扱えてしまえる点が便利であり注意を要するところです。

ここまで露骨なエラーは実際に起きることは無いと思いますが、コードが複雑化すると同種のミスは意外と起きるものです。特に他の人が書いた長いモジュールを修正する場合はインポートのasで定義した別名、関数名、変数名等の重複による上書きには気をつけてください。