如何使用 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
。
谢谢
考虑以下数据集:
{
'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
。
谢谢