在cpython调用中检测空白/空函数?

时间:2016-03-22 15:48:02

标签: python optimization cpython

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

接收到串行数据时,会调用一个可选的用户定义的python函数:

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

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

请注意,应用程序是C ++中的实时处理引擎,因此对cpython解释器的任何调用都会消耗相当多的开销。我有权访问预编译的函数,所以有没有办法确定它是否如上所述空白/空,而不是直接手工解析文本?

感谢。

1 个答案:

答案 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占用一个常量插槽),依此类推。对于更复杂的那些,您可以检查字节码反汇编器输出输出。