Python 怎么实现类似 go 那种通过字段 tag 实现各种格式的序列化、反序列化、以及校验等特征

2023-02-25 09:09:46 +08:00
 1800x

比如下面的 Go 结构体:

type CompanyBase struct {
	// ID id
	ID int64 `json:"id" db:"id"`

	// Name 名称
	Name string `json:"name" db:"title"`

	// Deleted 逻辑删除标志。0 为未删除。1 为已删除
	Deleted bool `json:"deleted" db:"deleted"`

	// CreateTime 创建时间
	CreateTime time.Time `json:"create_time" db:"create_time"`

	// UpdateTime 更新时间
	UpdateTime time.Time `json:"update_time" db:"update_time"`
}

上面结构体字段 tag ,json 用于 json 序列化和反序列化,db 用于数据库序列化和反序列化。
还可以加别的标签,实现校验。这个例子没有。
当然,得有一个库,读取字段标签,执行序列化、反序列化、校验等功能。
另外,还得支持嵌套结构。

如果换了是 python ,怎么实现?

2112 次点击
所在节点    Python
8 条回复
ruanimal
2023-02-25 09:19:24 +08:00
Pydantic
dearmymy
2023-02-25 09:21:59 +08:00
dataclass ,搜下就好。
应该可以适合大部分情况了。
daytonight
2023-02-25 10:13:27 +08:00
marshmallow
di94sh
2023-02-25 10:32:04 +08:00
python 这边是 dict 转一切 pydantic 一把梭
FarmerChillax
2023-02-25 23:52:22 +08:00
marshmallow 和 Pydantic 都可以
matrix1010
2023-02-26 14:18:28 +08:00
通过 tag 真的好吗,我很反感这种通过 string 注释来完成逻辑的方式. 很有可能你会手滑打错什么的。go 有个 library 叫 ozzo-validation: https://github.com/go-ozzo/ozzo-validation. 就是专门为了避免这种 tag validate 方式: "use normal programming constructs rather than error-prone struct tags to specify how data should be validated."
siteshen
2023-02-26 16:25:44 +08:00
# 实现一个呗:


class UnderScoreJsonFieldMixin:
def json_name(self):
return to_cunderscore(self.name)


class Field:
def __init__(self, name):
pass

def json_name(field_type):
return name.upper()


class IntField(Field):
pass


class StringField(Field):
pass


class User:
name = StringField("name")
age = IntField("age")

def __init__(self, name, age):
self.name = name
self.age = age

def json(self):
return {
self.name.json_name(): self.name,
self.age.json_name(): self.age,
}
1800x
2023-03-17 08:05:08 +08:00
@matrix1010 手打滑的概率很低。如果真的打滑了,vscode 会提示

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/919061

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX