pythonのクラス変数に外部関数を使うときにTypeError: [function name]() takes 0 positional arguments but 1 was givenとエラーになってしまう問題を考える
4071 ワード
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')
可能であれば引数をバリデーションする癖をつけておきましょう。
たったこれだけの事なんですが、えらい目に遭いました。
読了後いいね!をお願いします。
どれだけの方に読んでもらっているか知りたいので、お手数をおかけしますがご協力いただけると嬉しいです。
Author And Source
この問題について(pythonのクラス変数に外部関数を使うときにTypeError: [function name]() takes 0 positional arguments but 1 was givenとエラーになってしまう問題を考える), 我々は、より多くの情報をここで見つけました https://qiita.com/nomurasan/items/f8b749930ed0af16d76c著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .