-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpydentic
More file actions
290 lines (224 loc) · 7.24 KB
/
pydentic
File metadata and controls
290 lines (224 loc) · 7.24 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
# Lesson 2: Pydantic Basics
In this lesson, you'll learn the fundamentals of Pydantic models for data validation using a customer support system as your example application. You'll see how to define data models, validate user input, and handle validation errors gracefully.
By the end of this lesson, you'll be able to:
- Create Pydantic models to validate user input data
- Handle validation errors with proper error handling
- Use optional fields and field constraints in your models
- Work with JSON data validation methods
---
```python
# Import libraries needed for the lesson
from pydantic import BaseModel, ValidationError, EmailStr
import json
```
### Define a UserInput Pydantic model and populate it with data
```python
# Create a Pydantic model for validating user input
class UserInput(BaseModel):
name: str
email: EmailStr
query: str
```
```python
# Create a model instance
user_input = UserInput(
name="Joe User",
email="joe.user@example.com",
query="I forgot my password."
)
print(user_input)
```
### Note: the following cell will produce a validation error. You can correct the error by following along with the video, or just proceed with the rest of the notebook as cells below do not depend on this cell.
```python
# Attempt to create another model instance with an invalid email
user_input = UserInput(
name="Joe User",
email="not-an-email",
query="I forgot my password."
)
print(user_input)
```
### Define a function for error handling and try different inputs
```python
# Define a function to handle user input validation safely
def validate_user_input(input_data):
try:
# Attempt to create a UserInput model instance from user input data
user_input = UserInput(**input_data)
print(f"✅ Valid user input created:")
print(f"{user_input.model_dump_json(indent=2)}")
return user_input
except ValidationError as e:
# Capture and display validation errors in a readable format
print(f"❌ Validation error occurred:")
for error in e.errors():
print(f" - {error['loc'][0]}: {error['msg']}")
return None
```
```python
# Create an instance of UserInput using validate_user_input() function
input_data = {
"name": "Joe User",
"email": "joe.user@example.com",
"query": "I forgot my password."
}
user_input = validate_user_input(input_data)
```
```python
# Attempt to create an instance of UserInput with missing query field
input_data = {
"name": "Joe User",
"email": "joe.user@example.com"
}
user_input = validate_user_input(input_data)
```
### Update your UserInput data model with additional fields and experiment with different input data
```python
# Import additional libraries for enhanced validation
from pydantic import Field
from typing import Optional
from datetime import date
# Define a new UserInput model with optional fields
class UserInput(BaseModel):
name: str
email: EmailStr
query: str
order_id: Optional[int] = Field(
None,
description="5-digit order number (cannot start with 0)",
ge=10000,
le=99999
)
purchase_date: Optional[date] = None
```
```python
# Define a dictionary with required fields only
input_data = {
"name": "Joe User",
"email": "joe.user@example.com",
"query": "I forgot my password."
}
# Validate the user input data
user_input = validate_user_input(input_data)
```
```python
print(user_input)
```
```python
# Define a dictionary with all fields including optional ones
input_data = {
"name": "Joe User",
"email": "joe.user@example.com",
"query": f"""I bought a laptop carrying case and it turned out to be
the wrong size. I need to return it.""",
"order_id": 12345,
"purchase_date": date(2025, 12, 31)
}
# Validate the user input data
user_input = validate_user_input(input_data)
```
```python
# Define a dictionary with all fields and including additional ones
input_data = {
"name": "Joe User",
"email": "joe.user@example.com",
"query": f"""I bought a laptop carrying case and it turned out to be
the wrong size. I need to return it.""",
"order_id": 12345,
"purchase_date": date(2025, 12, 31),
"system_message": "logging status regarding order processing...",
"iteration": 1
}
# Validate the user input data
user_input = validate_user_input(input_data)
```
```python
print(user_input)
```
```python
# Create an instance of UserInput with valid data
input_data = {
"name": "Joe User",
"email": "joe.user@example.com",
"query": f"""I bought a laptop carrying case and it turned out to be
the wrong size. I need to return it.""",
"order_id": 12345,
"purchase_date": "2025-12-31"
}
user_input = validate_user_input(input_data)
```
```python
# Define order_id as a string
input_data = {
"name": "Joe User",
"email": "joe.user@example.com",
"query": f"""I bought a laptop carrying case and it turned out to be
the wrong size. I need to return it.""",
"order_id": "12345",
"purchase_date": "2025-12-31"
}
# Validate the user input data
user_input = validate_user_input(input_data)
```
```python
# Define name field as an integer
input_data = {
"name": 99999,
"email": "joe.user@example.com",
"query": f"""I bought a laptop carrying case and it turned out to be
the wrong size. I need to return it.""",
"order_id": 12345,
"purchase_date": "2025-12-31"
}
# Validate the user input data
user_input = validate_user_input(input_data)
```
### Try starting with JSON data as input
```python
# Define user input as JSON data
json_data = '''
{
"name": "Joe User",
"email": "joe.user@example.com",
"query": "I bought a keyboard and mouse and was overcharged.",
"order_id": 12345,
"purchase_date": "2025-12-31"
}
'''
# Parse the JSON string into a Python dictionary
input_data = json.loads(json_data)
print("Parsed JSON:", input_data)
```
```python
# Validate the user iput data
user_input = validate_user_input(input_data)
```
```python
# Try different JSON input
json_data = '''
{
"name": "Joe User",
"email": "joe.user@example.com",
"query": "My account has been locked for some reason.",
"order_id": "01234",
"purchase_date": "2025-12-31"
}
'''
# Parse the JSON into a Python dictionary
input_data = json.loads(json_data)
print("Parsed JSON:", input_data)
```
```python
# Validate the customer support data from JSON with non-standard formats
user_input = validate_user_input(input_data)
```
### Try the `model_validate_json` method
### Note: the following cell will produce a validation error. You can correct the error by following along with the video.
```python
# Parse JSON and validate user input data in one step using model_validate_json method
user_input = UserInput.model_validate_json(json_data)
print(user_input.model_dump_json(indent=2))
```
---
## Conclusion
In this lesson, you learned how to use Pydantic models to validate user input for a customer support scenario. By defining clear data models and handling validation errors, you can ensure your code only works with well-formed data. This approach helps you build more robust and reliable applications, and sets the stage for more advanced validation and structured output in future lessons.