首页 > 解决方案 > 找出是否在类的 @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 内运行

标签: pythonclassstatic-methods

解决方案


staticmethod是实现描述符协议的包装器。描述符协议在方法查找期间应用,它不是堆栈帧中的额外层(在调用方法时,描述符不再涉及)。当您看到a.b()时,它的实现方式为:

  1. 加载a
  2. 加载的b属性a(在现代 CPython 中有一些古怪的优化,但逻辑行为保持不变)
  3. 调用加载的b

@staticmethod在第 2 步中插入自身(更改从加载b属性中获得的内容),而在堆栈跟踪中只有第 3 步可见。

您可以应用各种启发式方法来猜测您是否在 a 中staticmethod,但堆栈帧中的任何内容都不会直接告诉您(an@staticmethod看起来与不属于任何类的普通函数基本相同;这并没有错,因为@staticmethod基本上是一个使用类作为命名空间的普通函数,而不以任何方式实际使用该类)。如果你认为你需要知道这些信息,那你可能错了,你有一个 XY 问题,你没有告诉我们。


推荐阅读