我无法完成以下功能:
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返回的堆栈只有方法名,不知道如何找到属于该方法的类。
你总是在看着一个function语境;当函数执行时,方法上下文已经消失了。从技术上来说,函数充当描述符 http://docs.python.org/2/howto/descriptor.html#functions-and-methods当作为实例上的属性访问时(instance.method_name
),它返回一个方法对象。然后,方法对象在被调用时,依次调用原始函数,并将实例作为第一个参数。由于这一切都发生在 C 代码中,因此 Python 堆栈上不会保留原始方法对象的痕迹。
堆栈只需要跟踪命名空间以及要为本地命名空间执行的代码。这些函数不再需要原始函数对象,只有附加的代码对象仍然保留原始函数定义的名称以用于回溯目的。
If you know该函数是一种方法,您可以搜索self
当地名称。如果存在的话,type(self)
是类别instance,它不一定是定义该方法的类。
然后,您必须搜索该类及其基础(循环遍历.__mro__
属性)来尝试找到定义该方法的类。
您还需要考虑一些其他问题:
命名方法的第一个参数self
只是一个约定。如果有人选择了不同的名称,那么如果不亲自解析 Python 源代码,或者在堆栈中向上执行另一个步骤并尝试从中推断,您将无法弄清楚这一点that行如何调用函数,然后检索方法,它是.im_self
属性。
您只会获得定义该函数的原始名称。这不一定是调用它的名称。函数是一等对象,可以添加到不同名称的类中。
虽然传入了一个函数self
并且被定义为类定义的一部分,它可以被调用manually传递一个值self
而不是传递方法的通常路径(作为描述符的函数的结果)self
供调用者参考。
在 Python 3.3 及更高版本中,情况稍微好一些;函数对象有一个新的__qualname__属性 http://docs.python.org/3/whatsnew/3.3.html#pep-3155-qualified-name-for-classes-and-functions,其中将包括类名称。那么问题是您仍然需要从父堆栈帧中找到函数对象。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)