在 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
请注意,具有文档字符串的函数、具有略微不同的字节码(文档字符串占用常量槽)等等。对于更复杂的,您可以检查字节码反汇编程序输出输出。
我们有一个应用程序允许用户覆盖可选的 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
请注意,具有文档字符串的函数、具有略微不同的字节码(文档字符串占用常量槽)等等。对于更复杂的,您可以检查字节码反汇编程序输出输出。