Question

Je veux créer un namedtuple qui représente les drapeaux individuels dans un court bitfield. Je suis en train de sous-classe pour que je puisse déballer le bitfield avant que le tuple est créé. Cependant, ma tentative actuelle ne fonctionne pas:

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)

Maintenant, mon expérience avec super() est limitée et mon expérience avec __new__ est pratiquement inexistante, donc je ne suis pas tout à fait sûr que faire de la (me) TypeError: super.__new__(Status): Status is not a subtype of super d'erreur énigmatique. Googler et creuser dans les docs ont rien donné éclairant.

Aide?

Était-ce utile?

La solution

Vous aviez presque :-) Il y a seulement deux petites corrections:

  1. nouveau méthode a besoin d'un retour déclaration
  2. super appel devrait avoir deux arguments, cls et Statut

Le code résultant ressemble à ceci:

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)

Il fonctionne proprement, comme vous aviez prévu:

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

Autres conseils

Il faut éviter super à moins que vous explicitement la restauration à l'héritage multiple (espérons pas le cas ici ;-). Il suffit de faire quelque chose comme ...:

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)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top