如何从Python中作为该函数的参数传递的对象中获取函数的名称?

时间:2016-01-14 09:20:03

标签: python

假设我有一个名为 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"

1 个答案:

答案 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

这提供了您想要的结果(打印调用函数的名称)