为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

ibeautiful 2022-05-24 16:40:10
考虑以下数据集:{    'name': 'somecat',    'lives': [        {'number': 1, 'did': 'nothing'},        {'number': 2, 'did': 'saved the world'}    ]}我想要做的是attrs用来定义一个数据类,这样即使使用索引号我也可以自动完成import attr@attr.sclass 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如果这更有意义,我也愿意使用。
查看完整描述

1 回答

?
繁星点点滴滴

TA贡献1803条经验 获得超3个赞

诚然,我从来没有真正使用过该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。


查看完整回答
反对 回复 2022-05-24
  • 1 回答
  • 0 关注
  • 122 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信