我们有一个应用程序允许用户覆盖可选的python回调函数。
接收到串行数据时,会调用一个可选的用户定义的python函数:
def onDataReceived(bytes, timeStamp, address, peer):
return
这不是源文件,而是在应用程序中编译。
请注意,应用程序是C ++中的实时处理引擎,因此对cpython解释器的任何调用都会消耗相当多的开销。我有权访问预编译的函数,所以有没有办法确定它是否如上所述空白/空,而不是直接手工解析文本?
感谢。
答案 0 :(得分:2)
您可以查看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
请注意,具有docstring的函数具有稍微不同的字节码(docstring占用一个常量插槽),依此类推。对于更复杂的那些,您可以检查字节码反汇编器输出输出。