18
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

pythonのクラス変数に外部関数を使うとTypeError:(省略) but 1 was givenになる問題を考える

Last updated at Posted at 2018-03-28

変更前タイトル:pythonのクラス変数に外部関数を使うときにTypeError: function name takes 0 positional arguments but 1 was givenとエラーになってしまう問題を考える

タイトルが長いですが、言いたい事はそのままです。

問題

question.py
def outer():
    return 'outer'

class inner():
    function = outer
    def call_outer_function(self):
        print(self.function())

inner().function()

これを実施すると、タイトルの通りエラーになります。

解決

answer.py
def outer():
    return 'outer'

class inner():
    function = lambda self:outer()
    def call_outer_function(self):
        print(self.function())

inner().function()

クラス内でメソッドを使う場合、暗示的にselfが渡されます。
selfを捨てることで解決させようという発想です。

展開

lambda式で書いているので分かりにくいんですが、要するにこういう事をやってます。

answer.py
def outer():
    return 'outer'

class inner():
    def function(self):
        outer()

    def call_outer_function(self):
        print(self.function())

inner().function()

こちらはよく見る形だと思います。

実例

def outer(input)
を作っていて、クラス内から呼び出した時にif isinstance(input, '期待するobject')をやらなかったせいで、この関数ではエラーにならず通ってしまい、別の場所で問題になった時に追いかけるのにやたらと時間が掛かりました。
可能であれば引数をバリデーションする癖をつけておきましょう。
たったこれだけの事なんですが、えらい目に遭いました。

読了後いいね!をお願いします。

どれだけの方に読んでもらっているか知りたいので、お手数をおかけしますがご協力いただけると嬉しいです。

18
10
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?