是否可以在数据类中使用 *args?

Is it possible to use *args in a dataclass?

我最近开始使用 dataclasses,它们将是对 3.7 的一个很好的补充。我很好奇是否或如何使用 dataclasses.

重新创建此 class 的相同功能
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")

我认为这是因为 class 没有执行参数解包的说明。 有什么方法可以指示 dataclass 装饰器子菜单需要解包吗?

我在 PEP 中看到了一个如何覆盖 __init__ 的示例。

Sometimes the generated init method does not suffice. For example, suppose you wanted to have an object to store *args and **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)