You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
"Cell \u001b[0;32mIn[6], line 12\u001b[0m\n\u001b[1;32m 10\u001b[0m dog \u001b[38;5;241m=\u001b[39m Dog(names\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mBim\u001b[39m\u001b[38;5;124m\"\u001b[39m, age\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mten\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 11\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(dog\u001b[38;5;241m.\u001b[39mage, \u001b[38;5;28mint\u001b[39m):\n\u001b[0;32m---> 12\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mDog\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124ms age must be an integer.\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n",
383
+
"\u001b[0;31mValueError\u001b[0m: Dog's age must be an integer."
384
+
]
385
+
}
386
+
],
387
+
"source": [
388
+
"from dataclasses import dataclass\n",
389
+
"\n",
390
+
"\n",
391
+
"@dataclass\n",
392
+
"class Dog:\n",
393
+
" names: str\n",
394
+
" age: int\n",
395
+
"\n",
396
+
"\n",
397
+
"dog = Dog(names=\"Bim\", age=\"ten\")\n",
398
+
"if not isinstance(dog.age, int):\n",
399
+
" raise ValueError(\"Dog's age must be an integer.\")"
400
+
]
401
+
},
402
+
{
403
+
"cell_type": "markdown",
404
+
"id": "addd6347",
405
+
"metadata": {},
406
+
"source": [
407
+
"### Simplify Data Validation with Pydantic"
408
+
]
409
+
},
410
+
{
411
+
"cell_type": "markdown",
412
+
"id": "e4bb3a40",
413
+
"metadata": {},
414
+
"source": [
415
+
"Dataclasses require manual implementation of validation.\n",
416
+
"\n",
417
+
"On the other hand, Pydantic offers built-in validation that automatically validates data and provides informative error messages. This makes Pydantic particularly useful when working with data from external sources.\n"
418
+
]
419
+
},
420
+
{
421
+
"cell_type": "code",
422
+
"execution_count": 3,
423
+
"id": "3aaa4b09",
424
+
"metadata": {},
425
+
"outputs": [
426
+
{
427
+
"ename": "ValidationError",
428
+
"evalue": "1 validation error for Dog\nage\n Input should be a valid integer, unable to parse string as an integer [type=int_parsing, input_value='ten', input_type=str]\n For further information visit https://errors.pydantic.dev/2.5/v/int_parsing",
"Cell \u001b[0;32mIn[3], line 9\u001b[0m\n\u001b[1;32m 5\u001b[0m names: \u001b[38;5;28mstr\u001b[39m\n\u001b[1;32m 6\u001b[0m age: \u001b[38;5;28mint\u001b[39m\n\u001b[0;32m----> 9\u001b[0m dog \u001b[38;5;241m=\u001b[39m \u001b[43mDog\u001b[49m\u001b[43m(\u001b[49m\u001b[43mnames\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mBim\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mage\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mten\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\n",
434
+
"File \u001b[0;32m~/book/venv/lib/python3.11/site-packages/pydantic/main.py:164\u001b[0m, in \u001b[0;36mBaseModel.__init__\u001b[0;34m(__pydantic_self__, **data)\u001b[0m\n\u001b[1;32m 162\u001b[0m \u001b[38;5;66;03m# `__tracebackhide__` tells pytest and some other tools to omit this function from tracebacks\u001b[39;00m\n\u001b[1;32m 163\u001b[0m __tracebackhide__ \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mTrue\u001b[39;00m\n\u001b[0;32m--> 164\u001b[0m \u001b[43m__pydantic_self__\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m__pydantic_validator__\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mvalidate_python\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdata\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mself_instance\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m__pydantic_self__\u001b[49m\u001b[43m)\u001b[49m\n",
435
+
"\u001b[0;31mValidationError\u001b[0m: 1 validation error for Dog\nage\n Input should be a valid integer, unable to parse string as an integer [type=int_parsing, input_value='ten', input_type=str]\n For further information visit https://errors.pydantic.dev/2.5/v/int_parsing"
Copy file name to clipboardExpand all lines: docs/Chapter2/dataclasses.html
+72Lines changed: 72 additions & 0 deletions
Original file line number
Diff line number
Diff line change
@@ -516,6 +516,7 @@ <h2> Contents </h2>
516
516
<liclass="toc-h2 nav-item toc-entry"><aclass="reference internal nav-link" href="#frozen-true-make-your-data-classes-read-only">3.7.2. frozen=True: Make Your Data Classes Read-Only</a></li>
517
517
<liclass="toc-h2 nav-item toc-entry"><aclass="reference internal nav-link" href="#compare-between-two-data-classes">3.7.3. Compare Between Two Data Classes</a></li>
518
518
<liclass="toc-h2 nav-item toc-entry"><aclass="reference internal nav-link" href="#post-init-add-init-method-to-a-data-class">3.7.4. Post-init: Add Init Method to a Data Class</a></li>
519
+
<liclass="toc-h2 nav-item toc-entry"><aclass="reference internal nav-link" href="#simplify-data-validation-with-pydantic">3.7.5. Simplify Data Validation with Pydantic</a></li>
519
520
</ul>
520
521
</nav>
521
522
</div>
@@ -720,6 +721,76 @@ <h2><span class="section-number">3.7.4. </span>Post-init: Add Init Method to a D
<spanclass="k">raise</span><spanclass="ne">ValueError</span><spanclass="p">(</span><spanclass="s2">"Dog's age must be an integer."</span><spanclass="p">)</span>
<spanclass="ne">---> </span><spanclass="mi">12</span><spanclass="k">raise</span><spanclass="ne">ValueError</span><spanclass="p">(</span><spanclass="s2">"Dog's age must be an integer."</span><spanclass="p">)</span>
748
+
749
+
<spanclass="ne">ValueError</span>: Dog's age must be an integer.
<h2><spanclass="section-number">3.7.5. </span>Simplify Data Validation with Pydantic<aclass="headerlink" href="#simplify-data-validation-with-pydantic" title="Permalink to this heading">#</a></h2>
757
+
<p>Dataclasses require manual implementation of validation.</p>
758
+
<p>On the other hand, Pydantic offers built-in validation that automatically validates data and provides informative error messages. This makes Pydantic particularly useful when working with data from external sources.</p>
<spanclass="nn">File ~/book/venv/lib/python3.11/site-packages/pydantic/main.py:164,</span> in <spanclass="ni">BaseModel.__init__</span><spanclass="nt">(__pydantic_self__, **data)</span>
782
+
<spanclass="g g-Whitespace"></span><spanclass="mi">162</span><spanclass="c1"># `__tracebackhide__` tells pytest and some other tools to omit this function from tracebacks</span>
@@ -790,6 +861,7 @@ <h2><span class="section-number">3.7.4. </span>Post-init: Add Init Method to a D
790
861
<liclass="toc-h2 nav-item toc-entry"><aclass="reference internal nav-link" href="#frozen-true-make-your-data-classes-read-only">3.7.2. frozen=True: Make Your Data Classes Read-Only</a></li>
791
862
<liclass="toc-h2 nav-item toc-entry"><aclass="reference internal nav-link" href="#compare-between-two-data-classes">3.7.3. Compare Between Two Data Classes</a></li>
792
863
<liclass="toc-h2 nav-item toc-entry"><aclass="reference internal nav-link" href="#post-init-add-init-method-to-a-data-class">3.7.4. Post-init: Add Init Method to a Data Class</a></li>
864
+
<liclass="toc-h2 nav-item toc-entry"><aclass="reference internal nav-link" href="#simplify-data-validation-with-pydantic">3.7.5. Simplify Data Validation with Pydantic</a></li>
0 commit comments