今いち推しのバリデーターpydanticの紹介20200213 Stapy@mizzsugar0424
View Slide
お前、誰よ● Twitter : @mizzsugar0425● 仕事:データ分析基盤の開発、運用○ GCP, BigQuery● 前の仕事はDjango。今でも追いかけてる。● 趣味:PythonでWeb開発○ Pyramid, Nuxt.js, TypeScript, PostgreSQL● 2/29にPyCon mini Shizuokaに登壇予定○ unittest.mockの話です● ゆるく転職活動○ 面接中に水をガブガブ飲む人間でも良いという企業様、ぜひ
# type: ignore
それは、静的型付けとPythonの両方を愛する者たちを苦しめるコメント
従来のバリデーターだとTypingのサポートがないimport colanderclass Item(colander.MappingSchema): # type: ignorename = colander.SchemaNode(colander.String())price = colander.SchemaNode(colander.Integer())
Typingサポートのあるバリデーター、pydantic● 2017年爆誕● Typingサポートあり● Python製WebフレームワークFastAPIでも紹介されている● mypy pluginありhttps://pydantic-docs.helpmanual.io/
基本的な書き方import pydanticclass Item(pydantic.BaseModel):name: strprice: int
基本的な書き方external_data = {'name': 'chocolate','price': 500}try:item = Item(**external_data)except ValueError e:e.json() # エラー内容が返される
まるでオブジェクトを扱うようclass User(pydantic.BaseModel):name: strbirthday: datetime.datefriends: List[int]favorite_color: Optional[str]int, str, List, Optional, datetime… などわりと使う型はサポートされている
楽々json!user = User.parse_raw('{"id":123,"signup_ts":1234567890,"name":"John Doe"}')print(user)#> id=123 signup_ts=datetime.datetime(2009, 2, 13,23, 31, 30,#> tzinfo=datetime.timezone.utc) name='John Doe'
快く使うために: mypy pluginのページは読んでねerror: Module 'pydantic' has no attribute 'BaseModel'[attr-defined]↑mypy から注意されたけどドキュメントのmypy pluginの設定を追加したら解消されたので良く読もうhttps://pydantic-docs.helpmanual.io/mypy_plugin/
さらば、# type: ignore
ありがとうございました。