You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Keep validation errors usable for builtin and partial callables - #510
The generic validator decorator accepts callables, but failure reporting assumes every callable has __name__ and an inspectable Python argument specification. A failing functools.partial or callable instance returns an error whose repr() raises AttributeError; validator(int)("invalid") raises an unrelated introspection TypeError instead of returning ValidationError.
Use the callable's type name when it has no function name. If introspection is unavailable, preserve the raw positional and keyword arguments in the error. Ordinary named functions retain their existing argument properties and representation. Raising-mode builtin failures still raise ValidationError with the original failure reason.
Validation: three added regressions fail on the base revision. Tox passes lint, strict Pyright type checking and all 1,174 tests on each supported Python version (3.11, 3.12, 3.13 and 3.14). Ruff formatting and git diff --check pass.
Thanks, the bug is real: repr() of a failure from a functools.partial raises AttributeError, and the __name__ fallback fixes that. Before I merge, I'd like two changes to the argument mapping:
getfullargspec includes self for callable instances and bound methods, so positional values get the wrong name. With this branch, validator(C())(3) for a C whose __call__(self, value) returns False gives args={'self': 3}. The callable-instance test passes only because it uses a keyword-only argument. Master has the same problem for bound methods (validator(obj.check)(3) reports self). inspect.signature(func).bind_partial(*args, **kwargs).arguments gets all of these right, and it raises ValueError for builtins like int, where your fallback can still apply. Could you switch to it and add a positional case for a callable instance and a bound method?
The fallback stores the raw call under the key "args", which collides with BaseException.args: error.args is still the exception's own tuple, while error.__dict__["args"] holds the call arguments. Could you use different names, for example positional_args and keyword_args?
Also, could you rebase onto master instead of merging it in? I merge with rebase.
Updated in 75f7021. Argument mapping now uses inspect.signature(func).bind_partial(*args, **kwargs).arguments, with positional regression cases for callable instances and bound methods. The builtin fallback uses positional_args and keyword_args. I also rebased onto master; the PR now contains one linear commit.
Validation: 15 focused tests and all 1521 tests passed on Python 3.11; Ruff lint/format and Pyright passed. These are local results; new-head CI is not yet verified.
This branch has not been deployed
No deployments
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The generic
validatordecorator accepts callables, but failure reporting assumes every callable has__name__and an inspectable Python argument specification. A failingfunctools.partialor callable instance returns an error whoserepr()raisesAttributeError;validator(int)("invalid")raises an unrelated introspectionTypeErrorinstead of returningValidationError.Use the callable's type name when it has no function name. If introspection is unavailable, preserve the raw positional and keyword arguments in the error. Ordinary named functions retain their existing argument properties and representation. Raising-mode builtin failures still raise
ValidationErrorwith the original failure reason.Validation: three added regressions fail on the base revision. Tox passes lint, strict Pyright type checking and all 1,174 tests on each supported Python version (3.11, 3.12, 3.13 and 3.14). Ruff formatting and
git diff --checkpass.Assisted by OpenAI Codex.