一个为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()