Dado un método, ¿cómo devuelvo la clase a la que pertenece en Python 3.3 en adelante?
Dadox = C.f
después:
class C:
def f(self):
pass
¿A qué llamo?x
eso volveráC
?
Lo mejor que puedo hacer esexec
ing una porción analizada dex.__qualname__
, que es feo:
exec('d = ' + ".".join(x.__qualname__.split('.')[:-1]))
Para un caso de uso, imagine que quiero un decorador que agregue unsuper
llame a cualquier método al que se aplique. ¿Cómo puede ese decorador, que solo recibe el objeto de función, hacer que la clasesuper
(el???
abajo)?
def ensure_finished(iterator):
try:
next(iterator)
except StopIteration:
return
else:
raise RuntimeError
def derived_generator(method):
def new_method(self, *args, **kwargs):
x = method(self, *args, **kwargs)
y = getattr(super(???, self), method.__name__)\
(*args, **kwargs)
for a, b in zip(x, y):
assert a is None and b is None
yield
ensure_finished(x)
ensure_finished(y)
return new_method