Skip to content

A convenient Python library inspired by Go./一个为python开发的,受golang启发的便捷库,它包含一些新奇的玩意能够提升与丰富你的开发体验。

License

Notifications You must be signed in to change notification settings

Kaguya233qwq/pymygo

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

6 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

pymygo

一个为python开发的,受golang启发的便捷库,它包含一些新奇的玩意能够提升与丰富你的开发体验。

Struct与JsonTag

允许你在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: F821

JsonTag的设计与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
#    }

使用go开发套件

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()

About

A convenient Python library inspired by Go./一个为python开发的,受golang启发的便捷库,它包含一些新奇的玩意能够提升与丰富你的开发体验。

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages