比方说,我有一个名为 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/