Изменение аргументов конструктора NamedTuple через подклассы?

StackOverflow https://stackoverflow.com/questions/3474118

Вопрос

Я хочу создать namedtuple который представляет отдельные флаги на коротком битовом поле. Я пытаюсь подкласс так, чтобы я мог распаковать битфилд до создания кортежа. Тем не менее, моя текущая попытка не работает:

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)

Теперь мой опыт с super() ограничен и мой опыт с __new__ практически не существует, поэтому я не совсем уверен, что сделать из (для меня) загадочной ошибки TypeError: super.__new__(Status): Status is not a subtype of super. Отказ Густь и копание в документы не дали ничего поучастия.

Помощь?

Это было полезно?

Решение

У тебя почти было это :-) Есть только две маленькие исправления:

  1. То новый Метод необходимо вернуть утверждение
  2. То супер Звонок должен иметь два аргумента, CLS. а также Положение дел

Полученный код выглядит так:

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)

Он проходит чисто, так же, как вы ожидали:

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

Другие советы

Я бы избежать super Если вы не четко обслуживаете многократное наследство (надеюсь, не так здесь ;-). Просто сделай что-то вроде ...

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)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top