一个为python开发的,受golang启发的便捷库,它包含一些新奇的玩意能够提升与丰富你的开发体验。
允许你在python中像go一样序列化/反序列化json和结构体。
定义你自己的结构体,并使用JsonTag为结构体中的字段添加注解:
from pymygo import Struct, JsonTag class User(Struct): Name: JsonTag[str, "name"] # noqa: F821 Age: JsonTag[int, "age"] # noqa: F821 Email: JsonTag[str, "email"] # noqa: F821JsonTag的设计与go中的json标签类似,你也可以像这样为字段添加注解:
from typing import Annotated from pymygo import Struct, JsonTag class User(Struct): Name: Annotated[str, JsonTag("name")] # noqa: F821 Age: Annotated[str, JsonTag("age")] # noqa: F821 Email: Annotated[str, JsonTag("email")] # noqa: F821但这种是底层实现的用法,为了简洁性与便利性我更推荐第一种。
从字典反序列化:
from pymygo import Struct, JsonTag class User(Struct): Name: JsonTag[str, "name"] # noqa: F821 Age: JsonTag[int, "age"] # noqa: F821 Email: JsonTag[str, "email"] # noqa: F821 user_data = {"name": "Alice"} user = User.from_dict(user_data) print(user) # >> User(name='Alice', age=None, email=None)从字符串反序列化:
user_data = '{"name": "Alice"}' user = User.unmarshal(user_data) print(user) # >> User(name='Alice', age=None, email=None)序列化为字符串并格式化:
from pymygo import Struct, JsonTag class User(Struct): Name: JsonTag[str, "name"] # noqa: F821 Age: JsonTag[int, "age"] # noqa: F821 Email: JsonTag[str, "email"] # noqa: F821 user = User(Name="Jack",Age=18) print(user) # >> User(name='Jack', age=18, email=None) print(user.marshal()) # >> { # "name": "Jack", # "age": 18, # "email": null # }序列化并转化为字典:
user = User(Name="Jack",Age=18) print(user) # >> User(name='Jack', age=18, email=None) print(user.to_dict()) # >> {'name': 'Jack', 'age': 18, 'email': None}将omitempty的值设为True可以在序列化后排除对应字段的零值:
from pymygo import Struct, JsonTag class User(Struct): Name: JsonTag[str, "name"] # noqa: F821 Age: JsonTag[int, "age"] # noqa: F821 Email: JsonTag[str, "email", True] # noqa: F821 user = User(Name="Jack",Age=18) print(user) # >> User(name='Jack', age=18) print(user.marshal()) # >> { # "name": "Jack", # "age": 18 # }from pymygo import Struct, JsonTag, go, Error, nil def trigger_error(): return "", Error("failed to fetch data") @go def trigger_panic(): _, err = trigger_error() if err != nil: go.panic(err) trigger_panic()