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?

¿Fue útil?

Solución

Casi lo :-) Hay sólo dos pequeñas correcciones:

  1. El nueva método necesita un retorno instrucción
  2. 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)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top