Slide 1

Slide 1 text

今いち推しのバリデーター pydanticの紹介 20200213 Stapy @mizzsugar0424

Slide 2

Slide 2 text

お前、誰よ ● Twitter : @mizzsugar0425 ● 仕事:データ分析基盤の開発、運用 ○ GCP, BigQuery ● 前の仕事はDjango。今でも追いかけてる。 ● 趣味:PythonでWeb開発 ○ Pyramid, Nuxt.js, TypeScript, PostgreSQL ● 2/29にPyCon mini Shizuokaに登壇予定 ○ unittest.mockの話です ● ゆるく転職活動 ○ 面接中に水をガブガブ飲む人間でも良いという企業様、ぜひ

Slide 3

Slide 3 text

# type: ignore

Slide 4

Slide 4 text

それは、 静的型付けとPythonの両方を 愛する者たちを苦しめる コメント

Slide 5

Slide 5 text

従来のバリデーターだとTypingのサポートがない import colander class Item(colander.MappingSchema): # type: ignore name = colander.SchemaNode(colander.String()) price = colander.SchemaNode(colander.Integer())

Slide 6

Slide 6 text

Typingサポートのあるバリデーター、pydantic ● 2017年爆誕 ● Typingサポートあり ● Python製WebフレームワークFastAPIでも紹介されている ● mypy pluginあり https://pydantic-docs.helpmanual.io/

Slide 7

Slide 7 text

基本的な書き方 import pydantic class Item(pydantic.BaseModel): name: str price: int

Slide 8

Slide 8 text

基本的な書き方 external_data = { 'name': 'chocolate', 'price': 500 } try: item = Item(**external_data) except ValueError e: e.json() # エラー内容が返される

Slide 9

Slide 9 text

まるでオブジェクトを扱うよう class User(pydantic.BaseModel): name: str birthday: datetime.date friends: List[int] favorite_color: Optional[str] int, str, List, Optional, datetime… などわりと使う型はサポートされている

Slide 10

Slide 10 text

楽々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'

Slide 11

Slide 11 text

快く使うために: mypy pluginのページは読んでね error: Module 'pydantic' has no attribute 'BaseModel' [attr-defined] ↑mypy から注意されたけど ドキュメントのmypy pluginの設定を追加したら解消されたので 良く読もう https://pydantic-docs.helpmanual.io/mypy_plugin/

Slide 12

Slide 12 text

さらば、 # type: ignore

Slide 13

Slide 13 text

ありがとうございました。