Tengo un código que funcionó en Python 3.6 y falla en Python 3.8. Parece reducirse a llamar superen 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 superresultado 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.dataclasslugar de heredar de typing.NamedTuple)?
Una pregunta secundaria es cómo puede fallar esto en el momento de la definición dado que la superllamada 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 foosea una referencia indefinida. ¿Es supermá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
superobjeto en sí, no una representación de suTestinstancia.