Можно ли использовать * args в классе данных? - PullRequest
0 голосов
/ 08 июня 2018

Я недавно начал использовать классы данных , и они будут хорошим дополнением к 3.7.Мне любопытно, если или как можно воссоздать ту же функциональность этого класса, используя классы данных.

class Nav(object):
    def __init__(self, name:str, menu, page, *submenus):
        self.name = name
        self.menu = menu
        self.page = page
        self.submenus = submenus

foo = Nav("name", "menu", "page")

Это не работает.Возникает исключение TypeError: __init__() missing 1 required positional argument: 'submenus'

@dataclass
class Nav(object):
    name:str
    menu: Any
    page: Any
    submenus: tuple

foo = Nav("name", "menu", "page")

Я предполагаю, что это потому, что у класса нет инструкций для распаковки аргументов. Есть ли способ указать декоратору класса данных, что подменю необходимо распаковать?

1 Ответ

0 голосов
/ 08 июня 2018

Я вижу в PEP пример того, как переопределить __init__.

Иногда сгенерированного init метода недостаточно.Например, предположим, что вы хотите иметь объект для хранения * args и ** kwargs:

@dataclass(init=False)
class ArgHolder:
    args: List[Any]
    kwargs: Mapping[Any, Any]

    def __init__(self, *args, **kwargs):
        self.args = args
        self.kwargs = kwargs

a = ArgHolder(1, 2, three=3)
...