Skip to main content

Python with enforced static typing

Project description

nakprok - Python with Enforced Static Typing

Same Python syntax. Zero dynamic typing.

nakprok (นาคปรก) is a subset of Python that enforces static type annotations everywhere. It's not a new language, but a stricter runtime for the Python you already know.

Why the name? Nakprok is a depiction of the Buddha sheltered by the multi-headed serpent Nāga in Thai Buddhist art. Just as the Naga protected the Buddha, this project protects your code from untyped or mistyped logic.

🚀 Key Concepts

  1. Explicit is Better than Implicit: If a value's type can't be seen in the code, it shouldn't be there.
  2. Zero Runtime Overhead: Validation happens at the AST level before execution. Once validated, it runs as standard CPython.
  3. Ecosystem Compatibility: Works with all existing Python libraries and tools.
  4. No New Syntax: Uses standard Python 3.10+ type hinting syntax.

🛠️ Implemented Rules

nakprok currently enforces the following rules inside functions (and classes):

1. Function Signatures

  • All parameters must be typed: def add(a: int, b: int) is required.
  • Return types are mandatory: -> None or -> int must be specified.
  • Exceptions: self and cls parameters in methods are exempt.
  • Variadic arguments: *args: str and **kwargs: Any must also have annotations.

2. Variable Declarations

  • Strict Local Typing: Every local variable must be declared with a type.
    • x: int = 10 (Annotated assignment)
    • x: int followed by x = 10 (Declaration then assignment)
  • Re-assignment: Once a variable is typed in the current scope, it can be re-assigned without repeating the annotation.
    x: int = 10
    x = 20  # Valid
    

3. Control Flow

  • For Loops: Loop variables must be previously declared.
    i: int
    for i in range(10): ...
    
  • With Statements: Context manager variables must be previously declared.
    f: TextIO
    with open("file.txt") as f: ...
    
  • Match Case: Variable captures in match patterns (e.g., case int(val):) are currently blocked because they don't support standard Python annotations. Use body annotations instead:
    match data:
        case int():
            val: int = data
            ...
    

4. Global Constants

  • Exemptions: UPPERCASE constants at the module level are exempt from strict typing by convention (e.g., MAX_SIZE = 100).

5. Prohibited Features

  • Lambdas: Blocked because Python provides no syntax for annotating their parameters or return types.
  • Untyped Unpacking: x, y = (1, 2) is blocked unless x and y were previously declared.

🔮 Future Roadmap

The project aims to become a complete "strict mode" for Python. Future plans include:

  1. Module-Level Enforcement: Extend strict typing to all module-level variables (not just UPPERCASE constants).
  2. Type-Safe Imports: Validate that imported names are used consistently with their types (integration with mypy or pyright stubs).
  3. Match Pattern Enhancement: Explore custom syntax or clever AST transforms to allow inline typing in match patterns.
  4. Strict Class Attributes: Enforce that all class attributes are declared in the class body with types.
  5. Decorator Validation: Ensure decorators preserve type information and are themselves strictly typed.
  6. Linter Integration: A dedicated VS Code / PyCharm extension to show nakprok errors in real-time.

📦 Installation & Usage

Installation

pip install -e .

Usage

# Check and run (default)
nakprok file.py

# Check types only
nakprok check file.py

# Explict run
nakprok run file.py

Example: factorial.py

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

def main() -> None:
    result: int = factorial(5)
    print(f"5! = {result}")

if __name__ == "__main__":
    main()
$ nakprok factorial.py
5! = 120

🧪 Testing

We maintain a comprehensive test suite to ensure all rules are correctly enforced.

pytest tests/ -v

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

nakprok-0.1.0.tar.gz (7.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

nakprok-0.1.0-py3-none-any.whl (8.5 kB view details)

Uploaded Python 3

File details

Details for the file nakprok-0.1.0.tar.gz.

File metadata

  • Download URL: nakprok-0.1.0.tar.gz
  • Upload date:
  • Size: 7.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/2.3.3 CPython/3.13.12 Linux/6.19.10-200.fc43.x86_64

File hashes

Hashes for nakprok-0.1.0.tar.gz
Algorithm Hash digest
SHA256 90ae009012b0bff7bb75f9e683bf90bceefa98929930a3a67b8a7d5a443cee86
MD5 762da1e8d0567017b3c542d8de30f9cb
BLAKE2b-256 319e96b0b7b0cc256dea227c0e0ea8a70deb868c978790e68ca182299f0fe77e

See more details on using hashes here.

File details

Details for the file nakprok-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: nakprok-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 8.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/2.3.3 CPython/3.13.12 Linux/6.19.10-200.fc43.x86_64

File hashes

Hashes for nakprok-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 945a581ba823a901ece05a5c0004b185e7484168fec2a10edc7da948a45ccb08
MD5 b247549aa5bc742fd269759a6ff4709c
BLAKE2b-256 d0b7ee53cfae1ba2db8a122d5e73e327ec8c660556dc244f1b1ab20652df9802

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page