Pergunta

Eu quero criar um namedtuple o que representa as bandeiras individuais em um curto campo de bits. Estou tentando subclassem para que eu possa descompactar o campo de bits antes que a tupla seja criada. No entanto, minha tentativa atual não 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)

Agora, minha experiência com super() é limitado e minha experiência com __new__ é praticamente inexistente, então não tenho muita certeza do que fazer do (para mim) erro enigmático TypeError: super.__new__(Status): Status is not a subtype of super. Google e cavar os documentos não produziram nada esclarecedor.

Ajuda?

Foi útil?

Solução

Você quase teve :-) Existem apenas duas pequenas correções:

  1. o novo O método precisa de um Retorna declaração
  2. o super Chamada deve ter dois argumentos, cls e Status

O código resultante se parece com o seguinte:

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)

Ele funciona de maneira limpa, assim como você esperava:

>>> print Status(47)
Status(started=1, checking=2, start_after_check=4, checked=8, error=0, paused=32, queued=0, loaded=0)

Outras dicas

Eu evitaria super A menos que você esteja explicitamente atendendo à herança múltipla (espero que não seja o caso aqui ;-). Apenas faça algo como ...:

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top