主要想做的就是
找过一大些资料都失败了, 目前结论如下
mypy 没法直接看源码, 然后看文档也没找到那种代码里 import mypy 然后做 cast 的功能
typing.cast 在标准库那个是预留给 linter 用的, 实际用不上
目前已经尝试过 __origin__
和 __args__
来做了, 效果还算不错, 但是感觉自己一点点拆包有点傻, 尤其是自己把不符合的先 _alias
, 然后对 _GenericAlias
做上述俩魔术方法, 遇到了 _SpecialForm
直接凉
mypy 官网提到的 MonkeyType (Python 3) and PyAnnotate (type comments only). 还没试
1
ipwx 2019-10-09 20:44:15 +08:00 1
1、你是想要做什么呢?如果是想要在每个函数的入口这么干,就太影响程序的性能了。
2、如果是想要对用户的输入(比如 API parameters )进行验证,可以使用 pydantic。 https://pydantic-docs.helpmanual.io/ |
2
ClericPy OP @ipwx pydantic 看过了, 不过当时只看了它的那些 BaseSchema 用法, 就是自定义, 不过我要处理的是 typing 里的内置类型(或者复合类型)
我只是想对某些值做一下类型校验, mypy 上没找到, 官方文档也是说 typing.cast 太影响性能所以什么都不做, 只留给 linters 做猴子补丁 我看看那些 mypy 以外的有没有什么办法吧 |
3
ClericPy OP @ipwx 好吧, 我傻了, 还是用 pydantic 吧
说白了其实我就是想知道下 typing 里那么多复杂的类型, 怎么做验证, 学习的目的 |
4
skinny 2019-10-09 20:50:56 +08:00
那是给 IDE 用的
|
6
ClericPy OP 我先研究研究用 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 2019-10-09 21:19:55 +08:00 1
看了 pydantic 源码,他是这么干的
https://gist.github.com/Trim21/910601a17fbeaa07bd203a93afce6131 我没仔细研究 field.validate 的第二个参数是干啥用的 |
8
ClericPy OP @Trim21 我之前第一选择是 pydantic , 后来因为看文档不仔细给弃用了, 结果仔细看了下文档, 觉得真香, 把我 3 个多小时写的垃圾全弃用了...
gist 我这边污染打不开, 好容易换 192.30.253.118 结果说 404.. |
9
Trim21 2019-10-09 21:34:00 +08:00 1
@ClericPy #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>] |
11
lolizeppelin 2019-10-09 21:58:42 +08:00
你们思维真是死板啊
这种标准类型直接 jsonschema 校验不就完了 非要纠结到语言的新功能上 |
12
ClericPy OP @lolizeppelin 感谢提醒, 我都快忘了那个库了, 刚听说 jsonschema 可以支持 Union Optional Dict[str,int]。
呃,show me your code? |
13
so1n 2019-10-09 23:25:53 +08:00
只处理过简单的,要__annotations__属性或者 inspect.signature
|