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

标签 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"

最佳答案

更好地设计你的程序

如果您系统地需要这个,您可能需要一个设计更好的程序,例如将父级或调用实体的名称注入(inject)例如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')

上面允许每个调用者注入(inject)该参数。

或者如果可能的话在初始化时在 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 hack

The inspect module provides several useful functions to help get information about live objects such as modules, classes, methods, functions, tracebacks, frame objects, and code objects.

是的,使用 inspect。当您调用 inspect.stack() 时,您会获得帧对象的记录。所以我们使用 stack()[1] 来获取前一帧,这是一个元组,其中第三个元素是调用者的名称 (my_function)。因此 stack()[1][3]

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

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

关于python - 如何从在 Python 中作为函数参数传递的对象获取函数名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34785683/

相关文章:

python - GCC 不使用安装到虚拟环境的库进行编译

python - 寻找一种快速的方法来加速我的代码

python - 在 mlab 中反转颜色图

python - 坚持亚马逊 ec2 实例的状态检查

python - python glob中的大括号扩展

python - "type object ' EllipticCurvePublicKey ' has no attribute ' from_encoded_point '"在 pysftp/Paramiko 中

python - 如何使 tkinter 框架填充整个 Canvas 并随之扩展?

python - 使用 pytest 和假设进行异常处理和测试

python - 如何用 null 替换 pandas 列中的特定字符?

python - pandas.series.copy 不创建新对象