0

考虑以下数据集:

{
    '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如果这更有意义,我也愿意使用。

4

1 回答 1

1

诚然,我从来没有真正使用过该attr模块,而是为了对您的代码进行最小的更改。我认为 usingtyping.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

谢谢

于 2019-09-09T16:56:17.477 回答