V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
1800x
V2EX  ›  Python

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

  •  
  •   1800x · 2023-02-25 09:09:46 +08:00 · 1845 次点击
    这是一个创建于 419 天前的主题,其中的信息可能已经有所发展或是发生改变。

    比如下面的 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 ,怎么实现?

    8 条回复    2023-03-17 08:05:08 +08:00
    ruanimal
        1
    ruanimal  
       2023-02-25 09:19:24 +08:00   ❤️ 1
    Pydantic
    dearmymy
        2
    dearmymy  
       2023-02-25 09:21:59 +08:00
    dataclass ,搜下就好。
    应该可以适合大部分情况了。
    daytonight
        3
    daytonight  
       2023-02-25 10:13:27 +08:00
    marshmallow
    di94sh
        4
    di94sh  
       2023-02-25 10:32:04 +08:00 via iPhone
    python 这边是 dict 转一切 pydantic 一把梭
    FarmerChillax
        5
    FarmerChillax  
       2023-02-25 23:52:22 +08:00
    marshmallow 和 Pydantic 都可以
    matrix1010
        6
    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
        7
    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
        8
    1800x  
    OP
       2023-03-17 08:05:08 +08:00 via Android
    @matrix1010 手打滑的概率很低。如果真的打滑了,vscode 会提示
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5096 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 05:42 · PVG 13:42 · LAX 22:42 · JFK 01:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.