unicodeクラスの継承は特殊?
unicodeクラスを継承したクラスの挙動で嵌っていることがあるので書いてみようと思います。
下のようなunicodeクラスを継承したTestというクラスを作ります。xという引数が1つだけありインスタンスが作成されると同時にそれを表示するというクラスです。この内容ではunicodeクラスを継承してる意味が全くありませんが簡単のためにこうしています。
class Test(unicode): def __init__(self, x): print x
いまxに"あいうえお"という引数を与えてインスタンスを作成してみます
a = Test("あいうえお") # あいうえお、が表示される
期待通りの動作です。問題はここからです。この"あいうえお"をキーワード引数として渡してみます。
b = Test(x="あいうえお")
すると
TypeError: 'x' is an invalid keyword argument for this function
というエラーになります。これの理由がわからなくて一日中悩んでいました。(継承が原因だと分かるのに半日くらい、原因が分かってから半日くらいですが)
ちなみにunicodeクラスを継承していないとどちらの引数のとり方でも期待通りの挙動になります。
class Test(object): def __init__(self, x): print x a = Test("あいうえお") # あいうえお b = Test(x="あいうえお") # あいうえお
なぜだろう・・・。
(5/13追記。理由はこういうことのようです→immutableな型のカスタマイズについて - 主にプログラムを勉強するブログ)