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

Mar*_*son 13 python python-3.x python-dataclasses

我最近开始使用数据类,它们将是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")
Run Code Online (Sandbox Code Playgroud)

这不起作用.提出例外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")
Run Code Online (Sandbox Code Playgroud)

我假设这是因为该类没有指令来解析参数. 有没有办法指示数据类装饰器需要解压缩子菜单?

Mar*_*son 7

我在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)
Run Code Online (Sandbox Code Playgroud)

  • Kinda首先打败了使用装饰器的目的。 (3认同)
  • 一年后,我不得不收回我的评论。Raymond Hettinger 在 PyCon 2018 上发表了演讲,讨论了为什么数据类仍然非常棒(即使我们必须覆盖 __init__) https://www.youtube.com/watch?v=T-TwcmT6Rcw (3认同)
  • 我的想法正好。装饰器为您提供了不错的`__repr__`,但是,是的,我有点失望。 (2认同)