ruff UP038: tool crashes
Hypothesis Nemotron 3 Super predicted to fire did not fire
Comments attached to the tuple or its elements (e.g., isinstance(x, (int, # comment float))) may be lost during the rewrite.
Program
Output
(no stdout)
(not run)
- fired
- 0 before · 0 after
- runs
- each version twice, same file name, no network
Judge Nemotron 3 Ultra advisory program-bug · low
The linter crashed because rule UP038 was removed from the codebase and cannot be selected, not because the rewrite changed program semantics. The oracle observed a tool crash due to the rule's removal, which is an environment/configuration issue unrelated to the fix's correctness.
Explanation Nemotron 3 Super unverified
The original expression uses parentheses to group arguments across lines; removing them changes parsing so that isinstance receives only one argument after x, causing a TypeError due to missing second argument, altering runtime behavior from valid type check to exception. This violates semantic equivalence despite identical source text appearance.
Reproduce
- file
prog.py(the before program)- minimized program
- r2-p003.py
- evidence sheet
- r2-p003.md
- regression fixture
- r2-p003.py the minimized program with a header stating the observed change, for the tool's test suite
python3 prog.py ruff check --preview --isolated --select UP038 --fix prog.py python3 prog.py
Upstream search GitHub issues Tavily Nemotron 3 Super + Ultra
UP038 fix · ruff UP038 isinstance tuple formatting · rule UP038 multiline isinstance parentheses · linter crash UP038 removed rule selection
no duplicate or related report 0 hits triaged
Details
- program
- Comments lost during rewrite
- hazard
- Comments attached to the tuple or its elements (e.g., isinstance(x, (int, # comment float))) may be lost during the rewrite.
- oracle
lint crashed: ruff failed Cause: Rule `UP038` was removed and cannot be selected.- run
- 2026-10-17T21-20-52-142Z-httm-ruff-UP038
generated program (4 lines) and the fix's diff
rule documentation given to the models
# non-pep604-isinstance (UP038) Derived from the **pyupgrade** linter. Fix is always available. ## Removed This rule was removed as using [PEP 604] syntax in `isinstance` and `issubclass` calls isn't recommended practice, and it incorrectly suggests that other typing syntaxes like [PEP 695] would be supported by `isinstance` and `issubclass`. Using the [PEP 604] syntax is also slightly slower. ## What it does Checks for uses of `isinstance` and `issubclass` that take a tuple of types for comparison. ## Why is this bad? Since Python 3.10, `isinstance` and `issubclass` can be passed a `|`-separated union of types, which is consistent with the union operator introduced in [PEP 604]. Note that this results in slower code. Ignore this rule if the performance of an `isinstance` or `issubclass` check is a concern, e.g., in a hot loop. ## Example ```python isinstance(x, (int, float)) ``` Use instead: ```python isinstance(x, int | float) ``` ## Options - `target-version` ## References - [Python documentation: `isinstance`](https://docs.python.org/3/library/functions.html#isinstance) - [Python documentation: `issubclass`](https://docs.python.org/3/library/functions.html#issubclass) [PEP 604]: https://peps.python.org/pep-0604/ [PEP 695]: https://peps.python.org/pep-0695/