如何使用 attrs 定义数组对象?

How can i define an object of arrays using attrs?

考虑以下数据集:

{
    'name': 'somecat',
    'lives': [
        {'number': 1, 'did': 'nothing'},
        {'number': 2, 'did': 'saved the world'}
    ]
}

我想做的是使用 attrs 定义一个数据类,这样即使在使用索引号时我也可以自动完成

import attr

@attr.s
class Cat(object):
    name = attr.ib()
    lives: list = [
        {'number': int, 'did': str} # trying to get autocompletion here
    ]


c = Cat('somecat')
print(c)
c.lives[0].number # trying to get autocompletion here

以上代码无效,但这是我正在努力完成的。

我该怎么做?我知道 metadata,但那是不可变的。如果更有意义的话,我也愿意使用 dataclasses

诚然,我从未真正使用过 attr 模块,但为了对您的代码进行最少的更改。我认为使用 typing.List 在这里也很有用。我个人会使用数据类,但这似乎也有效

import attr
import typing
from collections import namedtuple

live = namedtuple('live', ['number', 'did'])


@attr.s
class Cat(object):
    name = attr.ib()
    lives: typing.List[live] = attr.ib()


c = Cat('somecat', lives=[live(**{'number': 1, 'did': 'smile'})])
print(c)
c.lives[0].number  # auto completes

只有数据类

import typing
from dataclasses import dataclass


@dataclass
class live:
    number: int
    did: str


@dataclass
class Cat:
    name: str
    lives: typing.List[live]


c = Cat('somecat', lives=[live(**{'number': 1, 'did': 'smile'})])
print(c)
c.lives[0].number  # autocompletes

但是对于嵌套字典,这些数据类可能很难。像这样

data = {
    'name': 'somecat',
    'lives': [
        {'number': 1, 'did': 'nothing'},
        {'number': 2, 'did': 'saved the world'}
    ]
}

new_c = Cat(**data)
new_c.lives = [live(**data) for data in new_c.lives]

如果可以的话,我建议研究 pydantic

谢谢