gpt4 book ai didi

python - 从检查堆栈中获取完全限定的方法名称

转载 作者:太空宇宙 更新时间:2023-11-04 06:14:32 25 4
gpt4 key购买 nike

我无法完成以下功能:

def fullyQualifiedMethodNameInStack(depth=1):
"""
The function should return <file>_<class>_<method> for the method in the
stack at specified depth.
"""
fileName=inspect.stack()[depth][1]
methodName=inspect.stack()[depth][3]
class= """ please help!!! """
baseName=os.path.splitext( os.path.basename( fileName ) )[0]
return '{0}_{1}_{2}'.format( baseName, className, methodName )

如您所见,我需要正在执行的方法的类名。 inspect返回的栈只有方法名,不知道如何找到属于该方法的类。

最佳答案

您总是在查看函数 上下文;方法上下文在函数执行时已经消失。从技术上讲,functions act as descriptors当作为实例 (instance.method_name) 的属性访问时,它返回一个方法对象。然后,方法对象在被调用时,依次调用原始函数并将实例作为第一个参数。因为这一切都发生在 C 代码中,所以原始方法对象的任何痕迹都不会保留在 Python 堆栈中。

堆栈只需要跟踪命名空间和为本地命名空间执行的代码。这些函数不再需要原始函数对象,只有附加的代码对象仍保留原始函数定义的名称,以便回溯。

如果您知道函数是一个方法,您可以搜索一个self 本地名称。如果存在,type(self)实例 的类,它不一定是定义方法的类。

然后您必须搜索该类及其基础(遍历 .__mro__ 属性)以尝试找到定义该方法的类。

还有一些问题需要考虑:

  • 将方法的第一个参数命名为 self 只是一种约定。如果有人选择了不同的名称,如果不自己解析 Python 源代码,或者通过在堆栈中上升另一个步骤并尝试从 行推断出函数的作用,您将无法弄清楚被调用,然后检索该方法及其 .im_self 属性。

  • 您只会得到函数的原始名称,它是在该名称下定义的。这不一定是它被调用时所用的名称。函数是一流的对象,可以以不同的名称添加到类中。

  • 虽然一个函数是在 self 中传递的,并且被定义为类定义的一部分,但它可能已经被手动调用并传递了一个值 self 而不是方法的通常路径(作为描述符的函数的结果)传入调用者的 self 引用。

在 Python 3.3 及更高版本中,情况稍微好一些;函数对象有一个新的 __qualname__ attribute ,其中将包括类名。问题是您仍然需要从父堆栈框架中定位函数对象。

关于python - 从检查堆栈中获取完全限定的方法名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16589547/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com