根据官方的Marshmallow文档,建议声明一个Schema,然后有一个单独的类接收加载的数据,如下所示:
class UserSchema(Schema):
name = fields.Str()
email = fields.Email()
created_at = fields.DateTime()
@post_load
def make_user(self, data):
return User(**data)
Run Code Online (Sandbox Code Playgroud)
但是,我的User课程看起来像这样:
class User:
def __init__(name, email, created_at):
self.name = name
self.email = email
self.created_at = created_at
Run Code Online (Sandbox Code Playgroud)
这似乎不必要地重复我自己,我真的不喜欢不得不再写三次属性名称.但是,我确实喜欢IDE自动完成和静态类型检查明确定义的结构.
那么,有没有最佳实践根据Marshmallow模式加载序列化数据而不定义另一个类?
我正在尝试使用基于 Click 的 Flask CLI 基础设施来实现命令行应用程序。它的界面应该像这样工作:
app.py -c config.cfg cmd_a
app.py -c config.cfg cmd_b
Run Code Online (Sandbox Code Playgroud)
我有以下代码:
@click.group
@click.option('-c', 'config')
@click.pass_context
def cli(ctx, config):
ctx.obj = ObjA(config)
ctx.obj = ObjB(config) # Just for illustration
@cli.command()
@click.pass_context()
def cmd_a(ctx):
ctx.find_object(ObjA)
@cli.command()
@cli.pass_context()
def cmd_b(ctx):
ctx.find_object(ObjB)
cli()
Run Code Online (Sandbox Code Playgroud)
问题是,我需要根据标志创建两个不同的对象,-c并使它们都可供底层命令使用,这似乎是不可能的。有什么解决方法吗?
我知道我可以使用metaContext 对象的属性,但这意味着要编写大量样板文件。
我设置了以下测试程序(Python 3.9.5,numpy 1.20.2):
import asyncio
from datetime import datetime
import numpy as np
async def calculate():
print("=== unique")
await asyncio.to_thread(lambda: np.unique(np.ones((2000, 50000)), axis=0))
print("=== sort")
await asyncio.to_thread(lambda: np.sort(np.ones((2000, 50000)), axis=0))
print("=== cumsum")
await asyncio.to_thread(lambda: np.cumsum(np.ones((2000, 100000)), axis=0))
async def ping():
while True:
print("async", datetime.utcnow())
await asyncio.sleep(0.2)
async def main():
p1 = asyncio.create_task(ping())
c = asyncio.create_task(calculate())
await asyncio.wait([p1, c], return_when=asyncio.FIRST_COMPLETED)
p1.cancel()
asyncio.run(main())
Run Code Online (Sandbox Code Playgroud)
输出如下:
async 2021-05-21 13:20:16.308948
=== unique
async 2021-05-21 13:20:16.531135
async 2021-05-21 13:20:40.142323
=== sort
async 2021-05-21 13:20:40.343306
async 2021-05-21 …Run Code Online (Sandbox Code Playgroud)