假设我有一个名为 my_function 的函数,我将以下列方式传递一个对象作为参数:
my_obj = MyClass()
my_function(my_obj)
有没有办法可以在MyClass的方法中打印函数的名称?
假设MyClass在其中有一个名为 display_info 的方法,它会打印传递MyClass对象的函数名称。
一个例子是:
class MyClass:
def print_log(self):
# some code
def random_method_1():
pass
def random_method_2():
def my_function(param1, some_name, some_number):
# some code
# Instantiating MyClass
my_object = MyClass()
# Calling my_function
my_function(my_object, "John Doe", 38478347)
my_object.print_log()
# Above line of code should be able to print "my_function"
答案 0 :(得分:3)
如果您需要系统地使用此功能,则可能需要更好的设计程序,例如:一个将父实体或调用实体的名称注入例如my_obj.display_info(caller='something')
class MyClass:
def display_info(self, caller):
print caller
def my_function(my_obj):
my_obj.display_info(caller='my_function')
以上允许每个调用者注入该参数。
或者如果可能的话,在MyClass.caller
初始时在# pseudo code
class MyClass:
def __init__(self, caller):
self.caller = caller
def display_info(self):
print self.caller
my_obj = MyClass(caller='caller')
my_obj.display_info()
my_obj.caller = 'new_caller'
my_obj.display_info()
中保持对参与者的引用,或者根据需要在现场设置,例如。
inspect
inspect
黑客inspect module提供了几个有用的功能来帮助获取 有关活动对象的信息,例如模块,类,方法, 函数,回溯,框架对象和代码对象。
是usng inspect.stack()
。当你致电stack()[1]
时,你会得到一个框架对象的记录。因此我们使用stack()[1][3]
来获取前一帧,这是一个元组,其中第三个元素是调用者的名称(my_function)。因此>>> import inspect
>>> class MyClass():
... def display_info(self):
... print inspect.stack()[1][3]
...
>>> def my_function(my_obj):
... my_obj.display_info()
...
>>> my_obj = MyClass()
>>> my_function(my_obj)
my_function # <--- The result you wanted
>>>
>>> def another_fn(my_obj):
... my_obj.display_info()
...
>>> another_fn(my_obj)
another_fn
。
currentMoney
这提供了您想要的结果(打印调用函数的名称)