# inspect and dis

Inspect function metadata and the bytecode that pocketpy executes.

## inspect

| Function | Behavior |
| --- | --- |
| `isgeneratorfunction(obj)` | Whether a Python function or bound method is a generator function. |
| `is_user_defined_type(type)` | Whether a type was created by a Python `class` statement. |
| `signature(callable)` | A `Signature` with an ordered `parameters` dictionary for supported callables. |

```python
import inspect

def countdown(start, step=1):
    while start > 0:
        yield start
        start -= step

assert inspect.isgeneratorfunction(countdown)
signature = inspect.signature(countdown)
assert str(signature) == '(start, step=1)'
assert signature.parameters['step'].default == 1
```

Each `Parameter` exposes `name`, `kind`, and `default`.
`Parameter.empty` marks a missing default. The kind constants use the familiar
`POSITIONAL_ONLY`, `POSITIONAL_OR_KEYWORD`, `VAR_POSITIONAL`,
`KEYWORD_ONLY`, and `VAR_KEYWORD` names.

Signature metadata does not override pocketpy's
[argument rules](../features/differences.md#function-arguments).
In particular, the positional-or-keyword label is not a guarantee that a
required parameter can be passed by name.

Signature support is limited to Python functions and compatible wrappers,
bound methods, and class initializers. Not all built-in/native callables have
signatures. General source inspection, binding arguments to a signature,
and annotation introspection are not implemented.

## dis

`dis.dis(function_or_code)` prints a bytecode listing and returns `None`:

```python
import dis

def double(value):
    return value * 2

dis.dis(double)
```

Opcodes are specific to pocketpy and may change between versions.
Use the output to understand execution, not as a stable serialization format.

Implementations:
[inspect.py](https://github.com/pocketpy/pocketpy/blob/main/python/inspect.py),
[inspect.c](https://github.com/pocketpy/pocketpy/blob/main/src/modules/inspect.c),
[dis.c](https://github.com/pocketpy/pocketpy/blob/main/src/modules/dis.c).
