【问题标题】:How to get a function's name from a object passed as that function's parameter in Python?如何从 Python 中作为该函数的参数传递的对象中获取函数的名称?
【发布时间】:2016-01-14 09:20:02
【问题描述】:

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

【问题讨论】:

  • 我认为你应该澄清你的意思。如何使用它以及您期望的结果。
  • 答案基本上是否定的,但我不是很明白你的问题。您打算什么时候打印?你想让my_function(my_obj) 打印“my_function”吗?如果是这样,为什么不直接在 my_function 内部做呢?
  • 我认为@bakkal 为您提供了一个很好的答案,我想指出,听起来您正在创建一台会产生“副作用”的“奇怪机器”。这是非常糟糕的做法。也许你有一个很好的动机想要这种设计,但总的来说,我会说你的问题是架构上的,而不是程序上的。

标签: python


【解决方案1】:

更好地设计您的程序

如果您系统地需要这个,您可能需要一个设计更好的程序,例如一种将父实体或调用实体的名称注入到例如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 module 提供了几个有用的函数来帮助获取 关于活动对象的信息,例如模块、类、方法、 函数、回溯、框架对象和代码对象。

是的,使用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

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

【讨论】:

    猜你喜欢
    • 2019-04-02
    • 2020-01-13
    • 2010-12-24
    • 1970-01-01
    • 2019-10-28
    • 2017-06-04
    • 1970-01-01
    • 2019-09-09
    • 2012-07-03
    相关资源
    最近更新 更多