diff --git a/changelog.d/1474.change.md b/changelog.d/1474.change.md new file mode 100644 index 000000000..351257b2d --- /dev/null +++ b/changelog.d/1474.change.md @@ -0,0 +1,3 @@ +The type annotation for `attrs.validators.or_()` now allows for different types of validators. + +This was only an issue on Pyright. diff --git a/src/attr/validators.pyi b/src/attr/validators.pyi index 3b38e5980..36a7e800c 100644 --- a/src/attr/validators.pyi +++ b/src/attr/validators.pyi @@ -20,6 +20,9 @@ _T = TypeVar("_T") _T1 = TypeVar("_T1") _T2 = TypeVar("_T2") _T3 = TypeVar("_T3") +_T4 = TypeVar("_T4") +_T5 = TypeVar("_T5") +_T6 = TypeVar("_T6") _I = TypeVar("_I", bound=Iterable) _K = TypeVar("_K") _V = TypeVar("_V") @@ -90,4 +93,48 @@ def not_( msg: str | None = None, exc_types: type[Exception] | Iterable[type[Exception]] = ..., ) -> _ValidatorType[_T]: ... -def or_(*validators: _ValidatorType[_T]) -> _ValidatorType[_T]: ... +@overload +def or_( + __v1: _ValidatorType[_T1], + __v2: _ValidatorType[_T2], +) -> _ValidatorType[_T1 | _T2]: ... +@overload +def or_( + __v1: _ValidatorType[_T1], + __v2: _ValidatorType[_T2], + __v3: _ValidatorType[_T3], +) -> _ValidatorType[_T1 | _T2 | _T3]: ... +@overload +def or_( + __v1: _ValidatorType[_T1], + __v2: _ValidatorType[_T2], + __v3: _ValidatorType[_T3], + __v4: _ValidatorType[_T4], +) -> _ValidatorType[_T1 | _T2 | _T3 | _T4]: ... +@overload +def or_( + __v1: _ValidatorType[_T1], + __v2: _ValidatorType[_T2], + __v3: _ValidatorType[_T3], + __v4: _ValidatorType[_T4], + __v5: _ValidatorType[_T5], +) -> _ValidatorType[_T1 | _T2 | _T3 | _T4 | _T5]: ... +@overload +def or_( + __v1: _ValidatorType[_T1], + __v2: _ValidatorType[_T2], + __v3: _ValidatorType[_T3], + __v4: _ValidatorType[_T4], + __v5: _ValidatorType[_T5], + __v6: _ValidatorType[_T6], +) -> _ValidatorType[_T1 | _T2 | _T3 | _T4 | _T5 | _T6]: ... +@overload +def or_( + __v1: _ValidatorType[Any], + __v2: _ValidatorType[Any], + __v3: _ValidatorType[Any], + __v4: _ValidatorType[Any], + __v5: _ValidatorType[Any], + __v6: _ValidatorType[Any], + *validators: _ValidatorType[Any], +) -> _ValidatorType[Any]: ... diff --git a/typing-examples/baseline_examples.py b/typing-examples/baseline_examples.py index 6372a15df..0b20faf32 100644 --- a/typing-examples/baseline_examples.py +++ b/typing-examples/baseline_examples.py @@ -93,6 +93,17 @@ class Validated: num: int = attrs.field(validator=attrs.validators.ge(0)) +@attrs.define +class ValidatedInconsistentOr: + num: int | str = attrs.field( + validator=attrs.validators.or_( + # Various types of validators. + attrs.validators.ge(0), + attrs.validators.instance_of(str), + ) + ) + + attrs.validators.set_disabled(True) attrs.validators.set_disabled(False)