dis.dis()
リダイレクトせずに出力を取得する方法はありますsys.stdout
か? 私が試してみました:
out=str(dis.dis())
と
out=""""""
out+=str(dis.dis())
しかし、すぐに戻ってくることがわかりましたNone
。これを修正する方法はありますか?
dis.dis()
リダイレクトせずに出力を取得する方法はありますsys.stdout
か? 私が試してみました:
out=str(dis.dis())
と
out=""""""
out+=str(dis.dis())
しかし、すぐに戻ってくることがわかりましたNone
。これを修正する方法はありますか?
残念ながら、3.4 より前のバージョンの Python では、dis
モジュールは print ステートメントを stdout に使用するため、直接有用なものは返されません。dis
、disassemble
およびdisassemble_string
関数を再実装する必要があるかsys.stdout
、出力をキャプチャする代替手段に一時的に置き換える必要があります。
import sys
from cStringIO import StringIO
out = StringIO()
stdout = sys.stdout
sys.stdout = out
try:
dis.dis()
finally:
sys.stdout = stdout
out = out.getvalue()
これは、実際にはコンテキスト マネージャーを使用して行うのが最適です。
import sys
from contextlib import contextmanager
from cStringIO import StringIO
@contextmanager
def captureStdOut(output):
stdout = sys.stdout
sys.stdout = output
try:
yield
finally:
sys.stdout = stdout
out = StringIO()
with captureStdOut(out):
dis.dis()
print out.getvalue()
stdout
そうすれば、何か問題が発生した場合でも、復元されたことが保証されますdis
。ちょっとしたデモンストレーション:
>>> out = StringIO()
>>> with captureStdOut(out):
... dis.dis(captureStdOut)
...
>>> print out.getvalue()
83 0 LOAD_GLOBAL 0 (GeneratorContextManager)
3 LOAD_DEREF 0 (func)
6 LOAD_FAST 0 (args)
9 LOAD_FAST 1 (kwds)
12 CALL_FUNCTION_VAR_KW 0
15 CALL_FUNCTION 1
18 RETURN_VALUE
Python 3.4 以降では、関連する関数はfile
パラメーターを使用して出力をリダイレクトします。
from io import StringIO
with StringIO() as out:
dis.dis(file=out)
print(out.getvalue())
Colab / Jupyter を使用する場合
dis
1 つのセルで、出力を変数にリダイレクトして実行できます
%%capture dis_output
# dis : Disassembler for Python bytecode
from dis import dis
dis(function_to_check)
そして、Bashから使用できます。ここに例があります
! echo "{dis_output.stdout}" | grep -i global
14 4 LOAD_GLOBAL 0 (AudioLibrary)
36 LOAD_GLOBAL 2 (userLanguageAudio)
50 LOAD_GLOBAL 2 (userLanguageAudio)
62 LOAD_GLOBAL 3 (LESSON_FILES_DIR)
27 76 LOAD_GLOBAL 4 (get_ipython)
30 96 LOAD_GLOBAL 6 (pread)
31 104 LOAD_GLOBAL 7 (print)
34 >> 124 LOAD_GLOBAL 7 (print)
またはPythonから
print(dis_output.stdout)