historical_positional
error
Historical positional-only parameter violations
Before PEP 570 (Python 3.8), the convention for marking parameters as positional-only was to prefix their names with __ (double underscore) without a trailing __. Type checkers must support this historical mechanism.
Two violations are detected:
1. **PositionalOnlyAfterKeyword**: A __-prefixed positional-only parameter appears after a regular positional-or-keyword parameter in a function that does not use PEP 570 / syntax.
2. **KeywordPassedToPositionalOnly**: A __-prefixed keyword argument is passed at a call site (e.g. f(__x=3)), which is invalid because __x is positional-only and cannot be passed by keyword.
def f1(__x: int) -> None: ...
f1(__x=3) # E — __x is positional-only
def f2(x: int, __y: int) -> None: ... # E — __y after positional-or-keyword x
How to handle it
Every rule is on by default — strict is the default, not a cage. You can dial
historical_positional down per-file or per-path from your editor or
pyproject.toml, or fix the code
so it type-checks. See the Type System rules and
the complete diagnostic reference.
Canonical URL: https://www.basilisk-python.dev/errors/historical_positional