前提・実現したいこと
pythonで関数を呼び出した時、どの名前で呼び出したか知る方法はありませんか?
たとえば関数numを定義し、zero, one, two, threeという別名を付けます。
このときに、この関数がone()で呼ばれたのかtwo()で呼ばれたのか区別する方法はないでしょうか。
該当のソースコード
python
1from inspect import stack 2 3def num(): 4 s = stack() 5 f, c = s[0].function, s[1].code_context 6 print(f, c) # num, ['print(one() + two() + three())\n'] 7 func_names = ['zero', 'one', 'two', 'three'] 8 return func_names.index(f) if f in func_names else -1 9 10zero = one = two = three = num 11print(one() + two() + three()) # 現状では-3になってしまうのを6になるようにしたい
試したこと
inspect.stackから関数呼び出し時の情報を取得できないかと考えたのですが、.functon は常に元々の関数名('num')が格納されていました。.code_contextからは呼び出し時の情報は拾ってこれるようですが、サンプルコードのように同じ行で複数回呼び出しをしている場合に区別する方法がありません。
hayataka2049さんからの確認についてですが、
今回は技術的な興味からなので、関数のみで対応する方法がないか考えています。
検索してみたところ、classを使う場合は以下のような方法を発見することができました。
pytohn
1class My_Number: 2 def __init__(self, n): 3 self.n = n # この数字で誰が呼ばれたのか区別する 4 5 def __call__(self, *args, **kwargs): 6 return self.n 7 8zero, one, two, three = [My_Number(i) for i in range(4)] 9print(one() + two() + three())
回答2件
あなたの回答
tips
プレビュー