擅长:python、mysql、java
<p>共同例程设置了<code>COROUTINE</code>标志,代码标志中的位6:</p>
<pre><code>>>> async def foo(): pass
>>> foo.__code__.co_flags & (2 << 6)
128 # not 0, so the flag is set.
</code></pre>
<p>值128作为常量存储在<code>inspect</code>模块中:</p>
<pre><code>>>> import inspect
>>> inspect.CO_COROUTINE
128
>>> foo.__code__.co_flags & inspect.CO_COROUTINE
128
</code></pre>
<p><a href="https://docs.python.org/3/library/inspect.html#inspect.iscoroutinefunction" rel="noreferrer">^{<cd3>} function</a>就是这样做的;测试对象是否是函数或方法(以确保有一个<code>__code__</code>属性)并测试该标志。请参阅<a href="https://hg.python.org/cpython/file/v3.5.1/Lib/inspect.py#l180" rel="noreferrer">source code</a>。</p>
<p>当然,使用<code>inspect.iscoroutinefunction()</code>是最具可读性的,并且保证在代码标志发生更改时继续工作:</p>
<pre><code>>>> inspect.iscoroutinefunction(foo)
True
</code></pre>