Tengo un código que funcionó en Python 3.6 y falla en Python 3.8. Parece reducirse a llamar super
en la subclase de typing.NamedTuple
, como se muestra a continuación:
<ipython-input-2-fea20b0178f3> in <module>
----> 1 class Test(typing.NamedTuple):
2 a: int
3 b: float
4 def __repr__(self):
5 return super(object, self).__repr__()
RuntimeError: __class__ not set defining 'Test' as <class '__main__.Test'>. Was __classcell__ propagated to type.__new__?
In [3]: class Test(typing.NamedTuple):
...: a: int
...: b: float
...: #def __repr__(self):
...: # return super(object, self).__repr__()
...:
>>> # works
El propósito de esta super(object, self).__repr__
llamada es usar el estándar en '<__main__.Test object at 0x7fa109953cf8>'
__repr__
lugar de imprimir todo el contenido de los elementos de tupla (lo que sucedería de manera predeterminada). Hay algunas preguntas sobre el super
resultado de errores similares pero:
- Consulte la versión sin parámetros
super()
- Fallo ya en Python 3.6 (funcionó para mí antes de la actualización 3.6 -> 3.8)
- No entiendo cómo solucionar esto de todos modos, dado que no es una metaclase personalizada sobre la que tengo control sino el stdlib proporcionado
typing.NamedTuple
.
Mi pregunta es ¿cómo puedo solucionar esto mientras mantengo la compatibilidad con Python 3.6 (de lo contrario, solo usaría en @dataclasses.dataclass
lugar de heredar de typing.NamedTuple
)?
Una pregunta secundaria es cómo puede fallar esto en el momento de la definición dado que la super
llamada infractora está dentro de un método que aún no se ha ejecutado. Por ejemplo:
In [3]: class Test(typing.NamedTuple):
...: a: int
...: b: float
...: def __repr__(self):
...: return foo
funciona (hasta que realmente llamemos al __repr__
) aunque foo
sea una referencia indefinida. ¿Es super
mágico en ese sentido?
__repr__ = object.__repr__
en su definición de clase me funciona en Python3.6 y Python3.8
typing.NamedTuple
; typing.NamedTupleMeta
, eso está haciendo algunas travesuras. super()
requiere __class__
estar disponible en tiempo de compilación , que no es el caso aquí, aparentemente. Vea también: Proporcione un __classcell__
ejemplo para la metaclase Python 3.6
super
objeto en sí, no una representación de suTest
instancia.