猿问

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


ibeautiful
浏览 170回答 1
1回答

繁星点点滴滴

诚然,我从来没有真正使用过该attr模块,而是为了对您的代码进行最小的更改。我认为 usingtyping.List在这里也很有用。我个人会使用数据类,但这似乎也有效import attrimport typingfrom collections import namedtuplelive = namedtuple('live', ['number', 'did'])@attr.sclass 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 typingfrom dataclasses import dataclass@dataclassclass live:    number: int    did: str@dataclassclass 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。
随时随地看视频慕课网APP

相关分类

Python
我要回答