小编Tey*_*ras的帖子

使用棉花糖而不重复自己

根据官方的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模式加载序列化数据而不定义另一个类?

python dry marshmallow

11
推荐指数
2
解决办法
1070
查看次数

CLI 中的多个上下文对象(单击)

我正在尝试使用基于 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 command-line-interface python-click

5
推荐指数
1
解决办法
5135
查看次数

np.unique 使用 asyncio.to_thread 阻塞 CPU

我设置了以下测试程序(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)

python numpy python-asyncio

3
推荐指数
1
解决办法
508
查看次数