ruff UP038: tool crashes
Hypothesis Nemotron 3 Super predicted to fire did not fire
mutable default arguments and aliasing after a 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 issue unrelated to the fix's correctness.
Explanation Nemotron 3 Super unverified
The original function uses a mutable default argument for 'types', which persists across calls; modifying it in one call affects subsequent ones. The attempted rewrite likely replaced this with a non-mutable default or altered evaluation timing, changing when 'types' is bound—making each call use a fresh tuple instead of sharing state—thus altering behavior if the default were ever mutated, even if not shown here. This violates semantics because default argument evaluation occurs at function definition, not call, and any change to that timing or mutability breaks call-to-call consistency. (Note: No actual diff was applied due to tool crash, but the label 'unsafe' implies such a semantic risk.)
Reproduce
- file
prog.py(the before program)- minimized program
- r2-p006.py
- evidence sheet
- r2-p006.md
- regression fixture
- r2-p006.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 default · rule UP038 isinstance argument types · UP038 lint crash isinstance call
- related astral-sh/ruff/issues/13051 same rule UP038 but about documentation being outdated, not a crash on a tuple default argument
- related astral-sh/ruff/issues/7871 same rule UP038 but about performance/verbosity of rewrites on a literal tuple, not a crash on a tuple default argument
- related astral-sh/ruff/issues/18349 same rule UP038 but about deprecation warning UX, not a crash on a tuple default argument
Details
- program
- Mutable default arguments and aliasing
- hazard
- mutable default arguments and aliasing after a 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 (5 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/