DEV Community

Cover image for Disassembling Python Bytecode with the dis Library
≀Paulo Portela
≀Paulo Portela

Posted on • Edited on

2

Disassembling Python Bytecode with the dis Library

Introduction

The dis module in Python provides a disassembler for Python bytecode. This means that it can take a compiled Python code object and display a human-readable version of the instructions that the Python interpreter will execute. This can be useful for understanding how Python code is executed, for debugging, and reverse engineering.

In this chapter, we will explore the dis library in Python, its syntax, and how it can be used in mathematical contexts.

The dis Module in Python

The dis module provides several functions for working with Python bytecode. The most commonly used function is dis.dis, which disassembles a code object and displays the resulting bytecode in a human-readable format. Here is an example that demonstrates the use of the dis.dis function:

import dis

def factorial(n: int) -> int:
    if n == 0:
        return 1
    else:
        return n * factorial(n - 1)

dis.dis(factorial)
Enter fullscreen mode Exit fullscreen mode

Output:

  4           0 RESUME                   0

  5           2 LOAD_FAST                0 (n)
              4 LOAD_CONST               1 (0)
              6 COMPARE_OP              40 (==)
             10 POP_JUMP_IF_FALSE        1 (to 14)

  6          12 RETURN_CONST             2 (1)

  8     >>   14 LOAD_FAST                0 (n)
             16 LOAD_GLOBAL              1 (NULL + factorial)
             26 LOAD_FAST                0 (n)
             28 LOAD_CONST               2 (1)
             30 BINARY_OP               10 (-)
             34 CALL                     1
             42 BINARY_OP                5 (*)
             46 RETURN_VALUE
Enter fullscreen mode Exit fullscreen mode

In this example, we define a recursive function factorial that calculates the factorial of a non-negative integer n. We then use the dis.dis function to disassemble the code object of the factorial function. The output shows the bytecode instructions that the Python interpreter will execute when the factorial function is called.

Examples with Math

Here are some examples that demonstrate the use of the dis library in mathematical contexts:

Example 1: Disassembling a Fibonacci Function

import dis

def fibonacci(n: int) -> int:
    if n <= 1:
        return n
    else:
        return fibonacci(n - 1) + fibonacci(n - 2)

dis.dis(fibonacci)
Enter fullscreen mode Exit fullscreen mode

Output:

  4           0 RESUME                   0

  5           2 LOAD_FAST                0 (n)
              4 LOAD_CONST               1 (1)
              6 COMPARE_OP              26 (<=)
             10 POP_JUMP_IF_FALSE        2 (to 16)

  6          12 LOAD_FAST                0 (n)
             14 RETURN_VALUE

  8     >>   16 LOAD_GLOBAL              1 (NULL + fibonacci)
             26 LOAD_FAST                0 (n)
             28 LOAD_CONST               1 (1)
             30 BINARY_OP               10 (-)
             34 CALL                     1
             42 LOAD_GLOBAL              1 (NULL + fibonacci)
             52 LOAD_FAST                0 (n)
             54 LOAD_CONST               2 (2)
             56 BINARY_OP               10 (-)
             60 CALL                     1
             68 BINARY_OP                0 (+)
             72 RETURN_VALUE
Enter fullscreen mode Exit fullscreen mode

In this example, we define a recursive function fibonacci that calculates the n-th number in the Fibonacci sequence. We then use the dis.dis function to disassemble the code object of the fibonacci function. The output shows the bytecode instructions that the Python interpreter will execute when the fibonacci function is called.

Conclusion

In this chapter, we have explored the dis library in Python, its syntax, and how it can be used in mathematical contexts. We have seen how the dis.dis function can be used to disassemble a code object and display the resulting bytecode in a human-readable format. Through examples, we have demonstrated the use of the dis library in disassembling factorial and Fibonacci functions.

Image of Timescale

🚀 pgai Vectorizer: SQLAlchemy and LiteLLM Make Vector Search Simple

We built pgai Vectorizer to simplify embedding management for AI applications—without needing a separate database or complex infrastructure. Since launch, developers have created over 3,000 vectorizers on Timescale Cloud, with many more self-hosted.

Read more

Top comments (0)

Sentry image

See why 4M developers consider Sentry, “not bad.”

Fixing code doesn’t have to be the worst part of your day. Learn how Sentry can help.

Learn more