在cpython调用中检测空函数?

2024-06-08 06:52:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我们有一个应用程序,允许用户重写可选的python回调函数。你知道吗

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

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

这不是源文件,而是在应用程序中编译的。你知道吗

注意到,应用程序是C++中的实时处理引擎,所以对CPython解释器的任何调用都消耗相当多的开销。我确实可以访问预编译的函数,所以有没有方法来确定它是否像上面那样简单地为空,而不用直接手动解析文本?你知道吗

谢谢。你知道吗


Tags: 数据函数用户引擎应用程序示例returnbytes
1条回答
网友
1楼 · 发布于 2024-06-08 06:52:10

您可以检查func.__code__.co_code(python3;在python2上使用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占用一个常量槽),等等。对于更复杂的,你可以检查字节码反汇编输出。你知道吗

相关问题 更多 >

    热门问题