Claude Code for builtins: Python Built-in Functions and Types — Claude Skills 360 Blog
Blog / AI / Claude Code for builtins: Python Built-in Functions and Types
AI

Claude Code for builtins: Python Built-in Functions and Types

Published: December 6, 2028
Read time: 5 min read
By: Claude Skills 360

Python’s builtins module is the namespace that contains all built-in functions, exceptions, and types — everything available without an import. import builtins. Access: builtins.print, builtins.len, builtins.open, builtins.isinstance, etc. Replace for testing: builtins.input = lambda _: "mocked" — patches input() globally; restore with the original builtins.input. Custom print: replace builtins.print to intercept all print calls system-wide without modifying call sites. __import__: builtins.__import__ is the hook called by all import statements — replace it to intercept imports, add logging, or redirect to a virtual filesystem. Dynamic type creation: builtins.type("MyClass", (base1,), {"attr": value}) — three-argument type() creates a new class. Namespace introspection: vars(builtins) → all built-in names dict; dir(builtins) → sorted list. The __builtins__ attribute on a module is either the builtins module object (in __main__) or the module’s __dict__ (in other modules) — use import builtins for reliable access. Claude Code generates custom print hooks, test stubs, import interceptors, and namespace introspection tools.

CLAUDE.md for builtins

## builtins Stack
- Stdlib: import builtins
- Access: builtins.print, builtins.len, builtins.open, builtins.__import__
- Patch:  _orig = builtins.print; builtins.print = my_print
- Restore: builtins.print = _orig
- Inspect: vars(builtins)  # dict of all builtins
-          dir(builtins)   # sorted list
- Note:    prefer contextmanager wrappers over persistent global patches

builtins Namespace Pipeline

# app/builtinsutil.py — print hooks, input stub, import interceptor, type builder
from __future__ import annotations

import builtins
import functools
import sys
import time
from contextlib import contextmanager
from dataclasses import dataclass, field
from typing import Any, Callable, Generator, TextIO


# ─────────────────────────────────────────────────────────────────────────────
# 1. Print hook context managers
# ─────────────────────────────────────────────────────────────────────────────

@contextmanager
def capture_print() -> Generator[list[str], None, None]:
    """
    Context manager: capture all builtins.print() calls into a list.
    Yields the list; restores builtins.print on exit.

    Example:
        with capture_print() as lines:
            print("hello")
            print("world")
        assert lines == ["hello", "world"]
    """
    lines: list[str] = []
    original = builtins.print

    def _capturing(*args: object, sep: str = " ", end: str = "\n", **kw: object) -> None:
        lines.append(sep.join(str(a) for a in args))

    builtins.print = _capturing  # type: ignore[assignment]
    try:
        yield lines
    finally:
        builtins.print = original


@contextmanager
def prefix_print(prefix: str) -> Generator[None, None, None]:
    """
    Context manager: prepend prefix to every print() call.

    Example:
        with prefix_print("[DEBUG] "):
            print("something happened")   # prints "[DEBUG] something happened"
    """
    original = builtins.print

    def _prefixed(*args: object, sep: str = " ", end: str = "\n", **kw: object) -> None:
        original(prefix + sep.join(str(a) for a in args), end=end, **kw)

    builtins.print = _prefixed  # type: ignore[assignment]
    try:
        yield
    finally:
        builtins.print = original


@contextmanager
def timestamped_print(fmt: str = "%H:%M:%S") -> Generator[None, None, None]:
    """
    Context manager: add a timestamp prefix to every print() call.

    Example:
        with timestamped_print():
            print("server started")   # "12:34:56  server started"
    """
    import datetime
    original = builtins.print

    def _ts(*args: object, sep: str = " ", end: str = "\n", **kw: object) -> None:
        ts = datetime.datetime.now().strftime(fmt)
        original(f"{ts}  " + sep.join(str(a) for a in args), end=end, **kw)

    builtins.print = _ts  # type: ignore[assignment]
    try:
        yield
    finally:
        builtins.print = original


# ─────────────────────────────────────────────────────────────────────────────
# 2. Input stubbing for tests
# ─────────────────────────────────────────────────────────────────────────────

@contextmanager
def stub_input(responses: "list[str] | str") -> Generator[None, None, None]:
    """
    Context manager: replace builtins.input() with a stub that returns
    items from responses in order. Raises EOFError when exhausted.

    Example:
        with stub_input(["Alice", "30"]):
            name = input("Name: ")
            age  = input("Age: ")
        assert name == "Alice" and age == "30"
    """
    if isinstance(responses, str):
        responses = [responses]
    queue = list(responses)
    original = builtins.input

    def _stub(prompt: str = "") -> str:
        if not queue:
            raise EOFError("stub_input: no more responses")
        return queue.pop(0)

    builtins.input = _stub  # type: ignore[assignment]
    try:
        yield
    finally:
        builtins.input = original


# ─────────────────────────────────────────────────────────────────────────────
# 3. Import interceptor
# ─────────────────────────────────────────────────────────────────────────────

@dataclass
class ImportLog:
    entries: list[dict] = field(default_factory=list)

    def names(self) -> list[str]:
        return [e["name"] for e in self.entries]


@contextmanager
def log_imports() -> Generator[ImportLog, None, None]:
    """
    Context manager: log every import() call made within the block.

    Example:
        with log_imports() as log:
            import json
            import os.path
        print(log.names())
    """
    original = builtins.__import__
    record = ImportLog()

    def _logging_import(name: str, *args: object, **kwargs: object) -> object:
        record.entries.append({"name": name, "time": time.time()})
        return original(name, *args, **kwargs)

    builtins.__import__ = _logging_import  # type: ignore[assignment]
    try:
        yield record
    finally:
        builtins.__import__ = original


# ─────────────────────────────────────────────────────────────────────────────
# 4. Namespace introspection
# ─────────────────────────────────────────────────────────────────────────────

def list_builtins(category: str = "all") -> list[str]:
    """
    Return built-in names by category.
    category: "functions", "types", "exceptions", "constants", "all"

    Example:
        print(list_builtins("functions"))
    """
    names = dir(builtins)
    if category == "all":
        return names
    results = []
    for name in names:
        obj = getattr(builtins, name)
        if category == "functions" and callable(obj) and not isinstance(obj, type):
            results.append(name)
        elif category == "types" and isinstance(obj, type) and not issubclass(obj, BaseException):
            results.append(name)
        elif category == "exceptions" and isinstance(obj, type) and issubclass(obj, BaseException):
            results.append(name)
        elif category == "constants" and not callable(obj):
            results.append(name)
    return results


def builtin_doc(name: str) -> str:
    """
    Return the docstring (first line) of a built-in by name.

    Example:
        print(builtin_doc("sorted"))
    """
    obj = getattr(builtins, name, None)
    if obj is None:
        return f"<no builtin named {name!r}>"
    doc = getattr(obj, "__doc__", "") or ""
    return doc.strip().split("\n")[0]


# ─────────────────────────────────────────────────────────────────────────────
# 5. Dynamic class builder using type()
# ─────────────────────────────────────────────────────────────────────────────

def make_class(
    name: str,
    bases: tuple = (),
    attrs: "dict | None" = None,
) -> type:
    """
    Create a new class dynamically using builtins.type().

    Example:
        Point = make_class("Point", attrs={"x": 0, "y": 0})
        p = Point(); p.x = 3; p.y = 4
        print(p.x, p.y)
    """
    return builtins.type(name, bases or (object,), attrs or {})


def make_enum_class(name: str, members: list[str]) -> type:
    """
    Create a simple enum-like class with integer values 0, 1, 2, ...

    Example:
        Status = make_enum_class("Status", ["PENDING", "ACTIVE", "DONE"])
        print(Status.ACTIVE)   # 1
    """
    attrs = {member: i for i, member in enumerate(members)}
    attrs["_members"] = members

    @staticmethod  # type: ignore[misc]
    def _name(val: int) -> str:
        if 0 <= val < len(members):
            return members[val]
        return f"<unknown {val}>"

    attrs["name"] = _name
    return builtins.type(name, (object,), attrs)


# ─────────────────────────────────────────────────────────────────────────────
# Demo
# ─────────────────────────────────────────────────────────────────────────────

if __name__ == "__main__":
    print("=== builtins demo ===")

    # ── list_builtins ─────────────────────────────────────────────────────────
    print("\n--- list_builtins ---")
    fns = list_builtins("functions")
    types_ = list_builtins("types")
    excs = list_builtins("exceptions")
    print(f"  functions:  {len(fns)}{fns[:5]}")
    print(f"  types:      {len(types_)}{types_[:5]}")
    print(f"  exceptions: {len(excs)}{excs[:5]}")

    # ── builtin_doc ───────────────────────────────────────────────────────────
    print("\n--- builtin_doc ---")
    for name in ["sorted", "enumerate", "zip", "map"]:
        print(f"  {name}: {builtin_doc(name)[:60]}")

    # ── capture_print ─────────────────────────────────────────────────────────
    print("\n--- capture_print ---")
    with capture_print() as lines:
        print("alpha")
        print("beta", "gamma")
    print(f"  captured: {lines}")

    # ── prefix_print ──────────────────────────────────────────────────────────
    print("\n--- prefix_print ---")
    with prefix_print("[LOG] "):
        print("application started")
        print("ready")

    # ── stub_input ────────────────────────────────────────────────────────────
    print("\n--- stub_input ---")
    with stub_input(["Alice", "42"]):
        name = input("Name: ")
        age = input("Age: ")
    print(f"  name={name!r}  age={age!r}")

    # ── log_imports ───────────────────────────────────────────────────────────
    print("\n--- log_imports ---")
    with log_imports() as log:
        import decimal  # noqa: F401
        import fractions  # noqa: F401
    print(f"  imported: {log.names()}")

    # ── make_class / make_enum_class ──────────────────────────────────────────
    print("\n--- dynamic class creation ---")
    Point = make_class("Point", attrs={"x": 0, "y": 0, "__repr__": lambda self: f"Point({self.x},{self.y})"})
    p = Point(); p.x = 3; p.y = 4
    print(f"  Point instance: {p}")
    print(f"  isinstance check: {isinstance(p, Point)}")

    Status = make_enum_class("Status", ["PENDING", "ACTIVE", "DONE"])
    print(f"  Status.ACTIVE={Status.ACTIVE}  name={Status.name(Status.ACTIVE)}")

    print("\n=== done ===")

For the __builtins__ module attribute alternative — inside a module body, __builtins__ refers to either the builtins module (__main__) or the module’s __dict__ (other modules); the inconsistency makes it unreliable — always import builtins explicitly for reliable cross-module access to the built-in namespace. For the unittest.mock.patch / monkeypatch (pytest) alternative — unittest.mock.patch("builtins.print", ...) and pytest’s monkeypatch.setattr(builtins, "print", ...) patch built-in names per test with automatic teardown — use mock.patch for test-scoped patches integrated with the test framework; use the contextmanager wrappers shown above in production code or cross-framework test utilities where pytest/unittest are not available. The Claude Skills 360 bundle includes builtins skill sets covering capture_print()/prefix_print()/timestamped_print() print hook managers, stub_input() input replacement for testing, log_imports() import interceptor, list_builtins()/builtin_doc() namespace introspection, and make_class()/make_enum_class() dynamic type builders. Start with the free tier to try built-in namespace patterns and builtins pipeline code generation.

Keep Reading

AI

Claude Code for email.contentmanager: Python Email Content Accessors

Read and write EmailMessage body content with Python's email.contentmanager module and Claude Code — email contentmanager ContentManager for the class that maps content types to get and set handler functions allowing EmailMessage to support get_content and set_content with type-specific behaviour, email contentmanager raw_data_manager for the ContentManager instance that handles raw bytes and str payloads without any conversion, email contentmanager content_manager for the standard ContentManager instance used by email.policy.default that intelligently handles text plain text html multipart and binary content types, email contentmanager get_content_text for the handler that returns the decoded text payload of a text-star message part as a str, email contentmanager get_content_binary for the handler that returns the raw decoded bytes payload of a non-text message part, email contentmanager get_data_manager for the get-handler lookup used by EmailMessage get_content to find the right reader function for the content type, email contentmanager set_content text for the handler that creates and sets a text part correctly choosing charset and transfer encoding, email contentmanager set_content bytes for the handler that creates and sets a binary part with base64 encoding and optional filename Content-Disposition, email contentmanager EmailMessage get_content for the method that reads the message body using the registered content manager handlers, email contentmanager EmailMessage set_content for the method that sets the message body and MIME headers in one call, email contentmanager EmailMessage make_alternative make_mixed make_related for the methods that convert a simple message into a multipart container, email contentmanager EmailMessage add_attachment for the method that attaches a file or bytes to a multipart message, and email contentmanager integration with email.message and email.policy and email.mime and io for building high-level email readers attachment extractors text body accessors HTML readers and policy-aware MIME construction pipelines.

5 min read Feb 12, 2029
AI

Claude Code for email.charset: Python Email Charset Encoding

Control header and body encoding for international email with Python's email.charset module and Claude Code — email charset Charset for the class that wraps a character set name with the encoding rules for header encoding and body encoding describing how to encode text for that charset in email messages, email charset Charset header_encoding for the attribute specifying whether headers using this charset should use QP quoted-printable encoding BASE64 encoding or no encoding, email charset Charset body_encoding for the attribute specifying the Content-Transfer-Encoding to use for message bodies in this charset such as QP or BASE64, email charset Charset output_codec for the attribute giving the Python codec name used to encode the string to bytes for the wire format, email charset Charset input_codec for the attribute giving the Python codec name used to decode incoming bytes to str, email charset Charset get_output_charset for returning the output charset name, email charset Charset header_encode for encoding a header string using the charset's header_encoding method, email charset Charset body_encode for encoding body content using the charset's body_encoding, email charset Charset convert for converting a string from the input_codec to the output_codec, email charset add_charset for registering a new charset with custom encoding rules in the global charset registry, email charset add_alias for adding an alias name that maps to an existing registered charset, email charset add_codec for registering a codec name mapping for use by the charset machinery, and email charset integration with email.message and email.mime and email.policy and email.encoders for building international email senders non-ASCII header encoders Content-Transfer-Encoding selectors charset-aware message constructors and MIME encoding pipelines.

5 min read Feb 11, 2029
AI

Claude Code for email.utils: Python Email Address and Header Utilities

Parse and format RFC 2822 email addresses and dates with Python's email.utils module and Claude Code — email utils parseaddr for splitting a display-name plus angle-bracket address string into a realname and email address tuple, email utils formataddr for combining a realname and address string into a properly quoted RFC 2822 address with angle brackets, email utils getaddresses for parsing a list of raw address header strings each potentially containing multiple comma-separated addresses into a list of realname address tuples, email utils parsedate for parsing an RFC 2822 date string into a nine-tuple compatible with time.mktime, email utils parsedate_tz for parsing an RFC 2822 date string into a ten-tuple that includes the UTC offset timezone in seconds, email utils parsedate_to_datetime for parsing an RFC 2822 date string into an aware datetime object with timezone, email utils formatdate for formatting a POSIX timestamp or the current time as an RFC 2822 date string with optional usegmt and localtime flags, email utils format_datetime for formatting a datetime object as an RFC 2822 date string, email utils make_msgid for generating a globally unique Message-ID string with optional idstring and domain components, email utils decode_rfc2231 for decoding an RFC 2231 encoded parameter value into a tuple of charset language and value, email utils encode_rfc2231 for encoding a string as an RFC 2231 encoded parameter value, email utils collapse_rfc2231_value for collapsing a decoded RFC 2231 tuple to a Unicode string, and email utils integration with email.message and email.headerregistry and datetime and time for building address parsers date formatters message-id generators header extractors and RFC-compliant email construction utilities.

5 min read Feb 10, 2029

Put these ideas into practice

Claude Skills 360 gives you production-ready skills for everything in this article — and 2,350+ more. Start free or go all-in.

Back to Blog

Get 360 skills free