| # Python Conventions |
| |
| ## pytest |
| * Register helper fixtures using `pytest_plugins = ["<module_path>"]`. |
| * Name fixture functions with `fixture_` prefix and pass public name via |
| `@pytest.fixture(name="foo")`. |
| |
| ## CLI & Arguments |
| * Use direct attribute access (e.g. `args.foo`) on `argparse.Namespace` with |
| well-defined shapes. Avoid defensive `getattr()`. |
| |
| ## TypedDict |
| * **External Objects**: When defining a `TypedDict` for an external object, |
| link to its definition in the docstring. |
| |
| ## Type Checking & Annotations |
| * **In-file disables vs target skipping**: Prefer `# pyrefly: ignore[<error-code>]` |
| (e.g. `[missing-import]`) over `tags = ["no-pyrefly"]`. |
| * **No blanket ignores**: NEVER use bare `# type: ignore` or literal |
| `# type: ignore[...]`. Use error-specific ignores instead. |
| * **Ignore comments**: When adding `# pyrefly: ignore[...]` or type |
| suppressions, add an explanatory comment indicating why it is suppressed. |
| * **Type assertions**: When adding assertions for type narrowing, add an |
| end-of-line comment: `assert foo is not None # type assert`. |
| * **Consent for `Any`**: Require user consent before changing type annotations |
| to `Any`. |
| * **Union syntax (`X | None`)**: Use `X | None` instead of `typing.Optional[X]`. |
| Add `from __future__ import annotations` if necessary. |
| * **Collections generics**: Use `collections.abc` (e.g., `Sequence`, `Iterable`, |
| `Iterator`, `Callable`, `Mapping`) and builtin generics (`list`, `dict`, |
| `tuple`, `set`) instead of `typing.XXX` collection types. |
| |
| ## Runfiles |
| * **Fail-fast creation**: Prefer `runfiles.CreateOrRaise()` over |
| `runfiles.Create()` followed by manual `assert` when initializing runfiles in |
| tests and runtime scripts. |
| |
| ## Delegating Functions |
| * Module-level functions delegating to class methods should have a docstring |
| referring to the class method (e.g. `"""Refer to \`Class.method\`."""`). |
| |
| |