Also see root AGENTS.md for cross-language standards.
- Environment: use
uvfor all local Python environment setup in this repository. - First step in every new worktree or fresh checkout: run
uv sync --extra tests --extra devfrompython/before any Python command. Add other extras such asbenchmarks,torch, orgeoonly when needed. uv syncbuilds the localpylanceRust extension as part of environment setup. This can take a long time. Start it early, let it finish, and do not interrupt it or switch to a different setup path just because the build is slow.- Command execution: always use
uv run ...for Python-related repository commands. Do not rely on a globally activated environment. - Never invoke bare
python,pytest,pip,maturin,make test,make doctest,make lint, ormake formatfor repository work. - If a Python command fails outside
uv run, that does not count as a dependency or test failure. Fix the environment usage first and rerun correctly. - Build time expectations:
uv syncanduv run maturin developbuild the localpylanceRust extension as part of the environment workflow. This can be slow, especially on the first run or after Rust dependency changes; treat that as expected and do not switch to a different environment manager or shortcut around the build just because it takes time. - Build:
uv run maturin develop(required after Rust changes) - Test:
uv run make test - Run single test:
uv run pytest python/tests/<test_file>.py::<test_name> - Doctest:
uv run make doctest - Lint:
uv run make lint - Format:
uv run make format
- Keep bindings as thin wrappers — centralize validation and logic in Rust core.
- Extend existing methods with named arguments instead of adding new methods that accept policy/config objects — the Python API should feel Pythonic (e.g.,
cleanup_old_versions(..., retain_versions=N)), not mirror Rust builder patterns. - Pass all fields to Python dataclass constructors via PyO3, converting Rust
Nonetopy.None()instead of omitting args — dataclass constructors require all positional params. - Use parameterized type hints (e.g.,
list[DatasetBasePath],Optional[Dict[str, str]]) — never bare generics. Keep docstring type descriptions in sync with hints.
- Use
@pytest.mark.parametrizefor tests that differ only in inputs — extract shared setup into helpers. - Add tests to existing
test_{module}.pyfiles rather than creating new test files for the same module. - Replace
print()in tests withassertstatements.
- A missing module or missing command error from bare
python,pytest,pip,maturin, ormakeis usually an environment usage mistake, not a repository issue. - Before reporting a Python dependency as unavailable, verify that
uv sync --extra tests --extra devhas been run in the current worktree and that the failing command was executed withuv run ....