在 cpython 调用中检测 blank/empty 函数?

Detecting blank/empty function in cpython calls?

我们有一个应用程序允许用户覆盖可选的 python 回调函数。

接收串行数据时调用可选的用户定义python函数的示例:

def onDataReceived(bytes, timeStamp, address, peer):
    return

这不是来自源文件,而是在应用程序中编译的。

请注意,该应用程序是 C++ 中的实时处理引擎,因此对 cpython 解释器的任何调用都会消耗相当多的开销。我确实可以访问预编译函数,所以有什么方法可以确定它是否像上面那样简单 blank/empty 而无需直接手动解析文本?

谢谢。

您可以检查 func.__code__.co_code(Python 3;在 Python 2 上使用 func_code 而不是 co_code)。这是一个包含函数字节码的字节串。

因此:

>>> def foo():
...     return
... 
>>> def bar():
...     pass
... 
>>> import dis
>>> dis.dis(foo)
  2           0 LOAD_CONST               0 (None)
              3 RETURN_VALUE
>>> dis.dis(bar)
  2           0 LOAD_CONST               0 (None)
              3 RETURN_VALUE
>>> foo.__code__.co_code
b'd\x00\x00S'

因此您可以创建一个函数,将 __code__.co_code 与已知的空函数进行比较:

def empty():
    pass

empty_code = empty.__code__.co_code

def is_empty(func):
    return hasattr(func, '__code__') and func.__code__.co_code == empty_code

请注意,具有文档字符串的函数、具有略微不同的字节码(文档字符串占用常量槽)等等。对于更复杂的,您可以检查字节码反汇编程序输出输出。