-
Notifications
You must be signed in to change notification settings - Fork 1.6k
Description
Summary
super-call-with-parameters (UP008) should only apply when super is a global variable or __class__ is a nonlocal variable. Expressions that are merely equal to super aren’t good enough. Otherwise, the zero-argument super call doesn’t work. One solution is for the autofix to rewrite the super-equivalent expression to super, although that won’t work in all contexts. Example:
$ cat >up008.py <<'# EOF'
import builtins
class A:
def f(self):
print("!")
class B(A):
def f(self):
builtins.super(B, self).f()
B().f()
# EOF
$ python up008.py
!
$ ruff --isolated check up008.py --select UP008 --unsafe-fixes --fix
Found 1 error (1 fixed, 0 remaining).
$ cat up008.py
import builtins
class A:
def f(self):
print("!")
class B(A):
def f(self):
builtins.super().f()
B().f()
$ python up008.py 2>&1 | tail -n 1
RuntimeError: super(): __class__ cell not foundNote that the expression that UP008 rewrites can still use builtins.super (or other expressions that equal super but are not literally super) but super or __class__ just needs to be mentioned somewhere in the method in order for the __class__ cell, which the zero-argument super uses, to be created. True positive example with super:
$ cat >up008_super.py <<'# EOF'
import builtins
super = None # It still works even if `super` is shadowed!
class A:
def f(self):
print("!")
class B(A):
def f(self):
if False: super
builtins.super(B, self).f()
B().f()
# EOF
$ ruff --isolated check up008_super.py --select UP008 --unsafe-fixes --fix
Found 1 error (1 fixed, 0 remaining).
$ python up008_super.py
!True positive example with __class__:
$ cat >up008_class.py <<'# EOF'
import builtins
class A:
def f(self):
print("!")
class B(A):
def f(self):
if False: __class__
builtins.super(B, self).f()
B().f()
# EOF
$ ruff --isolated check up008_class.py --select UP008 --unsafe-fixes --fix
Found 1 error (1 fixed, 0 remaining).
$ python up008_class.py
!Version
ruff 0.12.3 (5bc81f2 2025-07-11)