gevent サルのパッチが有効になっているかどうかをライブラリがテストできる「公式の」方法はありますか?
3 に答える
正式な方法はわかりませんが、ここに方法があります。
os.fork
モンキー パッチが適用されたときの変更に注意してください。
>>> import os
>>> os.fork
<built-in function fork>
>>> import gevent.monkey; gevent.monkey.patch_all()
>>> os.fork
<function fork at 0x100535140>
そして、次のことに注意しgevent.fork
てください。
>>> import gevent
>>> gevent.fork
<function fork at 0x100535140>
したがって、モンキーがすべて (または os のみ) にパッチを適用する場合:
>>> is_monkeypatched = gevent.fork == os.fork
短い答えは「いいえ」です (そして、明らかに、ドキュメントに API が提供されていることが期待されます)。
より長い答えは、を使用して「ほとんど」monkey.saved
です。ソースを確認すると、通常のすべてのパッチ適用によって、元のアイテムへの参照でこのディクショナリが効果的に更新されていることがわかりますmonkey.get_original()
。公式性にはドキュメントが必要だと思われる場合、これは公式ではありませんが、 でエクスポートされていないにもかかわらず、内部 API として意図されていないようですmonkey.__all__
。
あなたの質問が単に「モンキー パッチは発生しましたか?」という意味であれば、次に、テストするだけif monkey.saved: ...
です。
「モジュール XXX にモンキー パッチが適用されていますか?」という意味であれば、次に、適切な名前をテストできます。if "threading" in monkey.saved: ...
参考までに、monkey.patch_all()
ここを実行した後、そこに何が表示されるかを示します。( patch_all() は実際にはすべてにパッチを適用するわけではないことに注意してください。デフォルトでは subprocess、sys、および Event が除外されるため、以下に含めました。)
>>> import os, gevent
>>> os.name, gevent.__version__
('posix', '1.0.1')
>>> from gevent import monkey
>>> monkey.patch_all(subprocess=True, sys=True, Event=True)
>>> monkey.saved.keys()
['socket', 'thread', 'ssl', 'gevent.socket', 'subprocess', 'sys', 'threading', 'time', 'os', 'select']