大发龙虎稳赢首页    注册   登录
大发龙虎稳赢 = way to explore
大发龙虎稳赢 是一个大发龙虎稳赢关于 分享和探索的地方
现在注册
已注册用户请  登录
大发龙虎稳赢推荐 学习书目
Learn Python the Hard Way
Python 学习手册
Python Cookbook
Python 基础教程
Python Sites
PyPI - Python Package Index
http://www.simple-is-better.com/
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
大发龙虎稳赢  ›  Python

Python 3.7+ 想验证一个对象是否符合 typing.Dict[str, int] 应该怎么做?

  •  
  •   Cler大发龙虎稳赢ICP y · 12 天前 · 976 次点击

    主要想做的就是

    1. 拿到一个对象, cast 出来这个对象是否符合 typing 里那些奇怪类型, Union Optional 等, 尤其是 Dict[str, int] 时候要判断每一个 key value 的类型
    2. 拿到不符合的类型时候, 自动转换一下, 比如 '1.1' 需要 float 类型, 自动转成 1.1

    找过一大些资料都失败了, 目前结论如下

    1. mypy 没法直接看源码, 然后看文档也没找到那种代码里 import mypy 然后做 cast 的功能

    2. typing.cast 在标准库那个是预留给 linter 用的, 实际用不上

    3. 目前已经尝试过 __origin____args__ 来做了, 效果还算不错, 但是感觉自己一点点拆包有点傻, 尤其是自己把不符合的先 _alias, 然后对 _GenericAlias 做上述俩魔术大发龙虎稳赢方法 , 遇到了 _SpecialForm 直接凉

    mypy 官网提到的 MonkeyType (Python 3) and PyAnnotate (type comments only). 还没试

    第 1 条附言  ·  12 天前
    问题已解决
    pydantic 已经实现了上述各种问题的解决方案, 怪只怪大发龙虎稳赢我 一开始看了一眼 fastapi 那边的用法就以为它功能就那么点。。。
    16 回复  |  直到 2019-10-11 14:42:25 +08:00
        1
    ipwx   12 天前   ♥ 1
    1、大发龙虎稳赢你 是想要做什么呢?如果是想要在每个函数的入口这么干,就太影响程序的性能了。
    2、如果是想要对用户的输入(比如 API parameters )进行验证,可以使用 pydantic。

    http://pydantic-docs.helpmanual.io/
        2
    Cler大发龙虎稳赢ICP y   12 天前
    @ipwx pydantic 看过了, 不过当时只看了它的那些 BaseSchema 用法, 就是自定义, 不过大发龙虎稳赢我 要处理的是 typing 里的内置类型(或者复合类型)
    大发龙虎稳赢我 只是想对某些值做一下类型校验, mypy 上没找到, 官方文档也是说 typing.cast 太影响性能所以什么都不做, 只留给 linters 做猴子补丁
    大发龙虎稳赢我 看看那些 mypy 以外的有没有什么办法吧
        3
    Cler大发龙虎稳赢ICP y   12 天前
    @ipwx 好吧, 大发龙虎稳赢我 傻了, 还是用 pydantic 吧
    说白了其实大发龙虎稳赢我 就是想知道下 typing 里那么多复杂的类型, 怎么做验证, 学习的目的
        4
    skinny   12 天前
    那是给 IDE 用的
        5
    Cler大发龙虎稳赢ICP y   12 天前
    @skinny 大发龙虎稳赢我 就是打算研究研究有什么自带的内置大发龙虎稳赢方法 可以让大发龙虎稳赢我 验证么, 毕竟 isinstance 是报错的
        6
    Cler大发龙虎稳赢ICP y   12 天前
    大发龙虎稳赢我 先研究研究用 type 动态构造 BaseModel 子类

    from pydantic import BaseModel
    import typing
    import inspect


    def test(a: int, b: typing.Dict[str, int]):
    pass


    sigs = inspect.signature(test)

    kwargs = {p.name: p.annotation for p in sigs.parameters.values()}
        7
    Trim21   12 天前   ♥ 1
    看了 pydantic 源码,他是这么干的



    大发龙虎稳赢我 没仔细研究 field.validate 的第二个参数是干啥用的
        8
    Cler大发龙虎稳赢ICP y   12 天前
    @Trim21 大发龙虎稳赢我 之前第一选择是 pydantic , 后来因为看文档不仔细给弃用了, 结果仔细看了下文档, 觉得真香, 把大发龙虎稳赢我 3 个多小时写的垃圾全弃用了...

    gist 大发龙虎稳赢我 这边污染打不开, 好容易换 192.30.253.118 结果说 404..
        9
    Trim21   12 天前   ♥ 1
    @Cler大发龙虎稳赢ICP y #8


    import pydantic.validators
    from pydantic.fields import Field

    from typing import Dict, Any

    field = Field(name='d',
    type_=Dict[str, int],
    class_validators=None,
    model_config=pydantic.BaseConfig)
    raw, errs = field.validate({'key': 'value'}, {'a': '1'}, loc='loc')
    print(raw, errs)
    # {'key': 'value'}, [<pydantic.error_wrappers.ErrorWrapper object at 0x00000199F1B9BE58>]
        10
    Cler大发龙虎稳赢ICP y   12 天前
    @Trim21 感谢,找了半天没找到,vscode 对这些相对路径的跳转太差了。。。已解决
        11
    lolizeppelin   12 天前
    大发龙虎稳赢你 们思维真是死板啊

    这种标准类型直接 jsonschema 校验不就完了 非要纠结到语言的新功能上
        12
    Cler大发龙虎稳赢ICP y   12 天前
    @lolizeppelin 感谢提醒, 大发龙虎稳赢我 都快忘了那个库了, 刚听说 jsonschema 可以支持 Union Optional Dict[str,int]。
    呃,show me your code?
        13
    so1n   12 天前
    只处理过简单的,要__annotations__属性或者 inspect.signature
        14
    Cler大发龙虎稳赢ICP y   12 天前
    @so1n 大发龙虎稳赢我 上面提到的 `__origin__ 和 __args__` 就是...
        15
    watsy0007   11 天前
    @Cler大发龙虎稳赢ICP y 改用 pydantic 搞定很多类型严重和转换问题.
        16
    Cler大发龙虎稳赢ICP y   11 天前
    @watsy0007 库是好库, 这两天看他们家源码是真特么看的想吐...
    大发龙虎稳赢关于   ·   FAQ   ·   API   ·   大发龙虎稳赢大发龙虎稳赢我 们 的愿景   ·   广告投放   ·   感谢   ·   实用小大发龙虎稳赢工具   ·   3076 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 24ms · UTC 10:45 · PVG 18:45 · LAX 03:45 · JFK 06:45
    ♥ Do have faith in what you're doing.