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

2024-01-07

我无法完成以下功能:

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(使用前将#替换为@)

从检查堆栈中获取完全限定的方法名称 的相关文章

随机推荐

  • 为什么 php 将空字节添加到私有和受保护的属性名称中?

    我是 PHP 世界的新手 并从中学习php net http php net 我知道 当将对象转换为数组时 会在私有和受保护的属性名称周围添加空字节班级名称 or 星号键 附加在数组键中私有和受保护的属性名称之前 但我的问题是WHYphp
  • 如何在运行时计算代码的校验和?

    我有一个在计算机上运行的 C NET 应用程序 如何在运行时计算整个代码的校验和 Note 我不想计算正在使用的图像的校验和 而是计算实际的代码部分 我从来没有用过这个 但是 使用反射 您可以导航到获取ILAsByteArray http
  • 编译循环依赖是如何工作的?

    我用 Java 制作了这个示例 但我认为 未经测试 它也适用于其他 所有 语言 您有 2 个文件 第一的 M java public class MType XType x MType x null 其次 另一个文件 在同一目录中 XTyp
  • GHz 至 MIPS?有人粗略估计一下吗?

    从迄今为止我所做的研究中 我了解到 MIPS 高度依赖于正在运行的应用程序或语言 但是谁能给我对 MIPS 中 2 5 Ghz 计算机的最佳猜测 或者任何其他数量的 Ghz C 如果有帮助的话 MIPS 代表 每秒百万条指令 但对于现代计算
  • 显示 Android 的返回堆栈

    为了更好地理解 Android 的行为 我想了解有关返回堆栈概念的更多信息 有没有一种方法可以按返回堆栈中的顺序列出所有活动 这还应该包括所有其他正在运行的任务 我发现 Android Studio 0 5 1 中提供了此信息 查看 gt
  • 如何在android中使用itext库阅读pdf

    我是安卓世界的新手 我厌倦了使用 eclipse IDE 创建一个 android 项目 其中我尝试在 itext 库的帮助下阅读 pdf 文件 该 pgm 未显示任何输出 请告诉我如何更正代码 以便我可以从项目中 Assets 文件夹中存
  • dataLayer.push后数据什么时候发送到google

    我有一个单页电子商务应用程序 需要设置谷歌电子商务渠道 我的应用程序在跟踪代码管理器数据层中设置漏斗步骤 文档中没有任何内容表明数据层实际发送到 Google 跟踪代码管理器的时间 window dataLayer 使用以下内容开始页面 e
  • 如何/可以在 Jasper 报告模板中使用 base64 作为图像源?

    所以在我的 jrxml 文件中我有以下内容
  • PHP 5.3 中 ++ 运算符的奇怪行为

    观看以下代码 a Test echo a 这将输出 Tesu 问题是 为什么 我知道 u 在 t 之后 但为什么它不打印 1 PHP 文档 此外 变量正在递增 或递减将转换为 适当的数值数据 类型 因此 下面的代码将 返回 1 因为字符串
  • 最小化多个仓库发货数量的算法

    我在美国有 10 个仓库 他们每个人可能有也可能没有产品 A B C D E 库存 有人从我的网站订购了全部五件商品 我想尽量减少发送的货件数量 如何确定哪些物品要从哪些仓库发货 例如 某人订购了 A B C D 和 E 我在纽约有 A 和
  • XSL - 评估条件表达式是否是“捷径”?

    给定 XSL If 语句
  • slf4j 没有 toString()

    当你做类似的事情时LOG debug Exported product 在 slf4j 中 它最终会在参数上调用 toString 例如product 由于某些原因 我无法在要用作参数的所有类上重写 toString 有些类来自第三方 ja
  • Angular $locationProvider 与 ASP.NET MVC 路由

    我正在使用 ASP NET MVC 使用 RouteCollection 类 处理路由 但我的前端是用 Angular 编写的 在某些地方我想使用 Angular 的 location 更改 url 并且我希望它支持 HTML5 所以我将这
  • QTimer::singleShot() 在给定对象的父类中查找指定的槽,而不是对象本身

    我对 Qt 还很陌生 我对现有的 Qt 应用程序做了一些简单的修改 但还没有从头开始创建任何应用程序 一般来说 我对 C 的某些方面 类继承等 也没有太多经验 我创建了一个新的基于 Qt4 的 Code Blocks 项目并对模板进行了一些
  • pandas DataFrame 到 html,使用内联样式而不是 CSS

    我正在尝试将 pandas DataFrame 作为 HTML 作为电子邮件的一部分发送 我试图使用类似的东西 import pandas as pd df pd DataFrame 1 1 2 3 2 4 5 6 def style ma
  • 消除 DateTimeFormat 和 Joda 的 DateTimeFormatter 之间细微的空白处理差异

    我们有一些现有的代码 如下所示 DateFormat dateFormats new SimpleDateFormat EEE d MMM yyyy HH mm ss Z Locale ENGLISH new SimpleDateForma
  • 当我在 .NET 5 中运行应用程序时,Serilog 不会创建日志 SQL 表

    我有 appsettings json 设置来自动创建日志表 autoCreateSqlTable true 但是 我检查了 SQL 但找不到该表 我似乎无法找到导致它无法创建和记录信息的原因 程序 cs public class Prog
  • 仅使用字符串 format() 方法的 Python 格式日期

    仅使用 python 格式化日期的快速方法是什么 format方法 我知道有一种方法可以不使用strftime 我需要更优雅的方法 我知道一个好方法 虽然不为人所知 但非常有用 您可以这样做 from datetime import dat
  • Ada 中的字符串数组

    我在 Ada95 中有一个程序 我必须在其中创建一个字符串数组 该数组可以包含可变长度的字符串 例子 我已经声明了一个数组 其中所有索引都可以存储大小为 50 的字符串 当我为上面的数组分配一个较小的字符串时 我收到 约束错误 Code p
  • 从检查堆栈中获取完全限定的方法名称

    我无法完成以下功能 def fullyQualifiedMethodNameInStack depth 1 The function should return