python - 找出是否在类的 @staticmethod 内部运行
问题描述
我使用以下内容来确定函数是否在对象内部被调用:
frame = inspect.currentframe().f_back.f_locals
obj = frame['self'] if 'self' in frame else None
if obj is None : raise Exception("use only in objects")
有没有办法确定我是否在类的@staticmethod 内运行
解决方案
staticmethod
是实现描述符协议的包装器。描述符协议在方法查找期间应用,它不是堆栈帧中的额外层(在调用方法时,描述符不再涉及)。当您看到a.b()
时,它的实现方式为:
- 加载
a
- 加载的
b
属性a
(在现代 CPython 中有一些古怪的优化,但逻辑行为保持不变) - 调用加载的
b
@staticmethod
在第 2 步中插入自身(更改从加载b
属性中获得的内容),而在堆栈跟踪中只有第 3 步可见。
您可以应用各种启发式方法来猜测您是否在 a 中staticmethod
,但堆栈帧中的任何内容都不会直接告诉您(an@staticmethod
看起来与不属于任何类的普通函数基本相同;这并没有错,因为@staticmethod
基本上是一个使用类作为命名空间的普通函数,而不以任何方式实际使用该类)。如果你认为你需要知道这些信息,那你可能错了,你有一个 XY 问题,你没有告诉我们。
推荐阅读
- apache-kafka - Apache Kafka 中面向消费者的静态成员资格
- java - 如何通过 getName().endsWith() 使用 FileFilter 的方法参考
- c++ - 在函数内部的声明中初始化一个数组并在外部使用它
- javascript - 如何使用javascript递归更新嵌套数组
- ios - Swift:推送视图控制器后,导航栏后面的 UISearchController 错误内容
- java - 将两个给定数组配对并赢得大部分比较的最佳策略
- javascript - 如何在 angularjs 中的 md-datepicker 中手动插入日期而不从日历中选择
- linux - 小猎犬骨板在 uart 上连续打印“c”
- c++ - 如何在 C++ 中获取堆栈跟踪错误异常?
- reactjs - 如何在 React 中更新数组中的状态变量?