我不相信,在框架对象级别上,没有任何方法可以找到已被调用的实际python函数对象。
但是,如果您的代码依赖于通用约定:命名方法的instance参数self
,则可以执行以下操作:
def get_class_from_frame(fr):
import inspect
args, _, _, value_dict = inspect.getargvalues(fr)
# we check the first parameter for the frame function is
# named 'self'
if len(args) and args[0] == 'self':
# in that case, 'self' will be referenced in value_dict
instance = value_dict.get('self', None)
if instance:
# return its class
return getattr(instance, '__class__', None)
# return None otherwise
return None
如果您不想使用@L_404_0@,则可以直接使用frame.f_locals
代替value_dict
和frame.f_code.co_varnames[:frame.f_code.co_argcount]
代替args
。
请记住,这仍然仅依靠约定,因此它不是可移植的,并且容易出错:
根据您要确切执行的操作,您可能需要花一些时间来更深入地了解所有这些问题的解决方法(可以检查返回的类中是否存在frame函数并共享相同的源,可以检测到描述符调用,对于类方法,等等。)