The Fool In The Valleyの雑記帳

-- 好奇心いっぱいのおじいちゃんが綴るよしなし事 --

Pythonは言ってくれない

実際のコードは複雑で、複数のモジュールに分かれているのだが、単純化すると以下のようなコードを書いた。

class C:
	def __init_(self):
    :
	def a(self):
		print("execute functin a()")
	def b(self):
		print("execute functin b()")
    :
c=C()
c.a()
c.b()

実行した結果は

execute functin a()
execute functin b()

となるはずなのに、なぜか

execute functin a()

となり、メソッドb()が実行されていないのである。この問題で昨日は半日以上悩んだ。
さんざん悩んだ末に、寝る前にやっとミスに気が付いた。下に示すように、class Cを定義したコードの最後の方に、メソッドb()のひな型として用意していた空のコードが紛れ込んでいたのである。

# coding: utf-8
class C:
	def __init_(self):
    :
	def a(self):
		print("execute functin a()")
	def b(self):
		print("execute functin b()")
    :
	def b(self):
		pass
    :
c = C()
c.a()
c.b()

実行すると、b()は、後に定義された空のメソッドで上書きされ、実行してもなにもしないようになっていたのである。今回はロボットの挙動がおかしいことでエラーに気が付いたが、プログラム自体は正常に終了するので見落としかねない。気がつけばなーんだであるが、質の悪いエラーである。
スクリプト言語であるPythonはクラスの中に同名のメソッドを複数定義していても淡々と実行してエラーだと言ってくれない。