La modificación de argumentos de constructor de un namedtuple a través de subclases?
-
28-09-2019 - |
Pregunta
Quiero crear una namedtuple
que representa las banderas individuales en un corto campo de bits. Estoy intentando subclase de modo que pueda descomprimir el campo de bits antes de crear la tupla. Sin embargo, mi intento actual no está funcionando:
class Status(collections.namedtuple("Status", "started checking start_after_check checked error paused queued loaded")):
__slots__ = ()
def __new__(cls, status):
super(cls).__new__(cls, status & 1, status & 2, status & 4, status & 8, status & 16, status & 32, status & 64, status & 128)
Ahora, mi experiencia con super()
está limitado y mi experiencia con __new__
es prácticamente inexistente, así que no estoy muy seguro de qué hacer con el (para mí) TypeError: super.__new__(Status): Status is not a subtype of super
error enigmática. Buscar en Google y la excavación en los documentos no han producido nada que alumbra.
Ayuda?
Solución
Casi lo :-) Hay sólo dos pequeñas correcciones:
- El nueva método necesita un retorno instrucción
- El Super llamada debe tener dos argumentos, cls y Estado
Los resultantes miradas código como este:
import collections
class Status(collections.namedtuple("Status", "started checking start_after_check checked error paused queued loaded")):
__slots__ = ()
def __new__(cls, status):
return super(cls, Status).__new__(cls, status & 1, status & 2, status & 4, status & 8, status & 16, status & 32, status & 64, status & 128)
Se ejecuta limpiamente, al igual que había esperado:
>>> print Status(47)
Status(started=1, checking=2, start_after_check=4, checked=8, error=0, paused=32, queued=0, loaded=0)
Otros consejos
Me gustaría evitar super
a menos que estés catering de forma explícita a la herencia múltiple (esperemos que no es el caso aquí ;-). Sólo hacer algo así ...:
def __new__(cls, status):
return cls.__bases__[0].__new__(cls,
status & 1, status & 2, status & 4,
status & 8, status & 16, status & 32,
status & 64, status & 128)