Rag*_*nar 3 python dictionary python-dataclasses
我在代码中经常使用字典作为数据结构。而不是Tuple像 Python 允许的那样返回几个值:
def do_smth():
[...]
return val1, val2, val3
Run Code Online (Sandbox Code Playgroud)
我更喜欢使用具有命名键优势的字典。但是对于复杂的嵌套字典,很难在其中导航。几年前我用 JS 编码时,我也喜欢字典,因为我可以像调用子部分一样thing.stuff.foo,IDE 帮助我处理结构。
我刚刚发现了DataClasspython 中的新内容,除了替换字典之外,我不确定这是什么原因?对于我所阅读的内容,DataClass内部无法包含函数,并且其参数的初始化已简化。
我想对此发表评论,你如何使用DataClass, 或关于 python 中的字典。
数据类更像是 NamedTuples 的替代品,然后是字典。
虽然 NamedTuples 被设计为不可变的,但数据类可以通过frozen=True在装饰器中设置来提供该功能,但总体上提供了更大的灵活性。
如果您喜欢Python 代码中的类型提示,它们就会真正发挥作用。
另一个优点就像你说的 - 复杂的嵌套字典。您可以将数据类定义为您的类型,并以清晰简洁的方式在数据类中表示它们。
考虑以下:
@dataclass
class City:
code: str
population: int
@dataclass
class Country:
code: str
currency: str
cities: List[City]
@dataclass
class Locations:
countries: List[Country]
Run Code Online (Sandbox Code Playgroud)
然后,您可以编写函数,在其中使用数据类名称注释函数参数作为类型提示并访问它的属性(类似于传入字典并访问它的键),或者构造数据类并输出它,即
def get_locations(....) -> Locations:
....
Run Code Online (Sandbox Code Playgroud)
它使代码非常易读,而不是一个庞大的复杂字典。
您还可以设置默认值,这在 NamedTuples 中是不允许的,但在字典中是允许的。
@dataclass
class Stock:
quantity: int = 0
Run Code Online (Sandbox Code Playgroud)
您还可以控制是否希望在装饰器中对数据类进行排序等,就像是否希望它被冻结一样,而普通字典则不进行排序。浏览此处获取更多信息
如果你想要它们,你会得到对象比较的所有好处,__eq__()例如等等。它们默认也有__init__,__repr__所以你不必像普通类一样手动输入这些方法。
还有对字段的更多控制,允许元数据等。
最后,您可以通过导入将其转换为字典 from dataclasses import dataclass asdict