在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Pydantic:強大的數據校驗工具

科技綠洲 ? 來源:Python實用寶典 ? 作者:Python實用寶典 ? 2023-10-30 11:40 ? 次閱讀

Pydantic 是一個使用Python類型注解進行數據驗證和管理的模塊。安裝方法非常簡單,打開終端輸入:

pip install pydantic

它類似于 Django DRF 序列化器的數據校驗功能,不同的是,Django里的序列化器的Field是有限制的,如果你想要使用自己的Field還需要繼承并重寫它的基類:

# Django 序列化器的一個使用例子,你可以和下面Pydantic的使用作對比
class Book(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    price = models.DecimalField(max_digits=5, decimal_places=2)
    author = models.CharField(max_length=32)
    publish = models.CharField(max_length=32)

而 Pydantic 基于Python3.7以上的類型注解特性,實現了可以對任何類做數據校驗的功能:

上滑查看更多代碼

# Pydantic 數據校驗功能
from datetimeimport datetime
from typingimport List, Optional
from pydanticimport BaseModel


class User(BaseModel):
id: int
name ='John Doe'
signup_ts: Optional[datetime] =None
friends: List[int] = []


external_data = {
'id':'123',
'signup_ts':'2019-06-01 12:22',
'friends': [1,2,'3'],
}
user = User(**external_data)
print(user.id)
print(type(user.id))
# > 123
# > < class 'int' >
print(repr(user.signup_ts))
# > datetime.datetime(2019, 6, 1, 12, 22)
print(user.friends)
# > [1, 2, 3]
print(user.dict())
"""
{
'id': 123,
'signup_ts': datetime.datetime(2019, 6, 1, 12, 22),
'friends': [1, 2, 3],
'name': 'John Doe',
}
"""

從上面的基本使用可以看到,它甚至能自動幫你做數據類型的轉換,比如代碼中的 user.id, 在字典中是字符串,但經過Pydantic校驗器后,它自動變成了int型,因為User類里的注解就是int型。

當我們的數據和定義的注解類型不一致時會報這樣的Error:

from datetime import datetime
from typing import List, Optional
from pydantic import BaseModel


class User(BaseModel):
    id: int
    name = 'John Doe'
    signup_ts: Optional[datetime] = None
    friends: List[int] = []


external_data = {
    'id': '123',
    'signup_ts': '2019-06-01 12:222',
    'friends': [1, 2, '3'],
}
user = User(**external_data)
"""
Traceback (most recent call last):
  File "1.py", line 18, in < module >
    user = User(**external_data)
  File "pydanticmain.py", line 331, in pydantic.main.BaseModel.__init__
pydantic.error_wrappers.ValidationError: 1 validation error for User
signup_ts
  invalid datetime format (type=value_error.datetime)
"""

即 "invalid datetime format", 因為我傳入的 signup_ts 不是標準的時間格式(多了個2)。

1. Pydantic模型數據導出 ****

通過Pydantic模型中自帶的 json 屬性方法,能讓經過校驗后的數據一行命令直接轉成 json 字符串,如前文中的 user 對象:

print(user.dict()) # 轉為字典
"""
{
    'id': 123,
    'signup_ts': datetime.datetime(2019, 6, 1, 12, 22),
    'friends': [1, 2, 3],
    'name': 'John Doe',
}
"""
print(user.json()) # 轉為json
"""
{"id": 123, "signup_ts": "2019-06-01T12:22:00", "friends": [1, 2, 3], "name": "John Doe"}
"""

非常方便。它還支持將整個數據結構導出為 schema json,它能完整地描述整個對象的數據結構類型:

上滑查看更多代碼

print(user.schema_json(indent=2))
"""
{
"title": "User",
"type": "object",
"properties": {
"id": {
"title": "Id",
"type": "integer"
},
"signup_ts": {
"title": "Signup Ts",
"type": "string",
"format": "date-time"
},
"friends": {
"title": "Friends",
"default": [],
"type": "array",
"items": {
"type": "integer"
}
},
"name": {
"title": "Name",
"default": "John Doe",
"type": "string"
}
},
"required": [
"id"
]
}
"""

2.數據導入

除了直接定義數據校驗模型,它還能通過ORM、字符串、文件導入到數據校驗模型:

比如字符串(raw):

from datetime import datetime
from pydantic import BaseModel


class User(BaseModel):
    id: int
    name = 'John Doe'
    signup_ts: datetime = None
      
m = User.parse_raw('{"id": 123, "name": "James"}')
print(m)
# > id=123 signup_ts=None name='James'

此外,它能直接將ORM的對象輸入,轉為Pydantic的對象,比如從Sqlalchemy ORM:

上滑查看更多代碼

from typingimport List
from sqlalchemyimport Column, Integer, String
from sqlalchemy.dialects.postgresqlimport ARRAY
from sqlalchemy.ext.declarativeimport declarative_base
from pydanticimport BaseModel, constr

Base = declarative_base()


class CompanyOrm(Base):
__tablename__ ='companies'
id = Column(Integer, primary_key=True, nullable=False)
public_key = Column(String(20), index=True, nullable=False, unique=True)
name = Column(String(63), unique=True)
domains = Column(ARRAY(String(255)))


class CompanyModel(BaseModel):
id: int
public_key: constr(max_length=20)
name: constr(max_length=63)
domains: List[constr(max_length=255)]

class Config:
orm_mode =True


co_orm = CompanyOrm(
id=123,
public_key='foobar',
name='Testing',
domains=['example.com','foobar.com'],
)
print(co_orm)
# > < models_orm_mode.CompanyOrm object at 0x7f0bdac44850 >
co_model = CompanyModel.from_orm(co_orm)
print(co_model)
# > id=123 public_key='foobar' name='Testing' domains=['example.com',
# > 'foobar.com']

從Json文件導入:

from datetime import datetime
from pathlib import Path
from pydantic import BaseModel


class User(BaseModel):
    id: int
    name = 'John Doe'
    signup_ts: datetime = None
      
path = Path('data.json')
path.write_text('{"id": 123, "name": "James"}')
m = User.parse_file(path)
print(m)

從pickle導入:

import pickle
from datetime import datetime
from pydantic import BaseModel

pickle_data = pickle.dumps({
    'id': 123,
    'name': 'James',
    'signup_ts': datetime(2017, 7, 14)
})
m = User.parse_raw(
    pickle_data, content_type='application/pickle', allow_pickle=True
)
print(m)
# > id=123 signup_ts=datetime.datetime(2017, 7, 14, 0, 0) name='James'

3.自定義數據校驗

你還能給它增加 validator 裝飾器,增加你需要的校驗邏輯:

上滑查看更多代碼

from sklearn.metrics import confusion_matrix
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

# 1.導入數據集
dataset = pd.read_csv('Social_Network_Ads.csv')
X = dataset.iloc[:, [1, 2, 3]].values
Y = dataset.iloc[:, 4].values

# 性別轉化為數字
labelencoder_X = LabelEncoder()
X[:, 0] = labelencoder_X.fit_transform(X[:, 0])

# 2.將數據集分成訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(
    X, Y, test_size=0.25, random_state=0)

# 3.特征縮放
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)

# 4.訓練
classifier = LogisticRegression()
classifier.fit(X_train, y_train)

# 5.預測
y_pred = classifier.predict(X_test)

# 6.評估預測

# 生成混淆矩陣
from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test, y_pred)
print(cm)

上面,我們增加了三種自定義校驗邏輯:

1.name 必須帶有空格

2.password2 必須和 password1 相同

3.username 必須為字母

讓我們試試這三個校驗是否有效:

user = UserModel(
    name='samuel colvin',
    username='scolvin',
    password1='zxcvbn',
    password2='zxcvbn',
)
print(user)
# > name='Samuel Colvin' username='scolvin' password1='zxcvbn' password2='zxcvbn'

try:
    UserModel(
        name='samuel',
        username='scolvin',
        password1='zxcvbn',
        password2='zxcvbn2',
    )
except ValidationError as e:
    print(e)
    """
    2 validation errors for UserModel
    name
      must contain a space (type=value_error)
    password2
      passwords do not match (type=value_error)
    """

可以看到,第一個UserModel里的數據完全沒有問題,通過校驗。

第二個UserModel里的數據,由于name存在空格,password2和password1不一致,無法通過校驗。因此我們定義的自定義校驗器完全有效。

4.性能表現

這是最令我驚訝的部分,Pydantic 比 Django-rest-framework 的校驗器還快了12.3倍:

Package版本相對表現平均耗時
pydantic1.7.393.7μs
attrs + cattrs20.31.5x slower143.6μs
valideer0.4.21.9x slower175.9μs
marshmallow3.102.4x slower227.6μs
voluptuous0.122.7x slower257.5μs
trafaret2.1.03.2x slower296.7μs
schematics2.1.010.2x slower955.5μs
django-rest-framework3.1212.3x slower1148.4μs
cerberus1.3.225.9x slower2427.6μs
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 模塊
    +關注

    關注

    7

    文章

    2736

    瀏覽量

    47797
  • 數據
    +關注

    關注

    8

    文章

    7170

    瀏覽量

    89711
  • 代碼
    +關注

    關注

    30

    文章

    4837

    瀏覽量

    69130
  • python
    +關注

    關注

    56

    文章

    4811

    瀏覽量

    85077
收藏 人收藏

    評論

    相關推薦

    實時嵌入式系統模型校驗技術

    模型校驗是最成功的需求驗證工具。模型校驗的基本原理如圖1所示。模型校驗工具的輸入是系統需求或設計(稱為模型)以及最終系統期望實現的特性(稱為
    發表于 11-01 18:14 ?882次閱讀
    實時嵌入式系統模型<b class='flag-5'>校驗</b>技術

    基于Atmega128單片機和CRC校驗碼實現無線傳輸數據時的差錯校驗

    隨著技術的不斷進步,各種數據通信的應用越來越廣泛。由于傳輸距離、現場狀況、干擾等諸多因素的影響,設備之間的通信數據常會發生一些無法預測的錯誤。為了降低錯誤所帶來的影響,一般在通信時采用數據校驗
    的頭像 發表于 05-05 17:36 ?3458次閱讀
    基于Atmega128單片機和CRC<b class='flag-5'>校驗</b>碼實現無線傳輸<b class='flag-5'>數據</b>時的差錯<b class='flag-5'>校驗</b>

    英飛凌強大的AURIX和工具鏈簡介

    英飛凌強大的AURIX,工具鏈簡介,謝謝北京西能提供工具簡介資料,希望對學習Tricore的童鞋有所指引。Aurix開發工具鏈20131219.pdf (1.03 MB )
    發表于 12-14 10:42

    校驗遇到數據校驗不到而導致出錯

    串口發送數據時,利用和校驗的方法對數據進行校驗,但是遇到數據校驗不到而導致出錯,請問這種情況該如
    發表于 04-14 23:04

    CRC校驗代碼自動生成工具

    CRC校驗代碼自動生成工具根據輸入條件自動產生各種CRC的VHDL或verilog源程序
    發表于 05-20 11:16 ?294次下載
    CRC<b class='flag-5'>校驗</b>代碼自動生成<b class='flag-5'>工具</b>

    基于Labview的串口通信數據校驗和的實現方法

    基于Labview的串口通信數據校驗和的實現方法
    發表于 01-09 17:58 ?173次下載
    基于Labview的串口通信<b class='flag-5'>數據</b><b class='flag-5'>校驗</b>和的實現方法

    校驗位的小工具

    電子發燒友網站提供《算校驗位的小工具.exe》資料免費下載
    發表于 07-25 16:06 ?2次下載

    文件校驗工具

    支持校驗文件的MD5SHA-256等值
    發表于 05-05 08:37 ?16次下載

    循環冗余校驗奇偶校驗累加和校驗等知識分享

    CRC校驗(循環冗余校驗)是數據通訊中最常采用的校驗方式。在嵌入式軟件開發中,經常要用到CRC
    的頭像 發表于 11-08 09:31 ?8796次閱讀
    循環冗余<b class='flag-5'>校驗</b>奇偶<b class='flag-5'>校驗</b>累加和<b class='flag-5'>校驗</b>等知識分享

    奇偶校驗是什么

    校驗依據:判斷傳輸的一組二進制數據中”1”的個數是奇數還是偶數 奇校驗:如果以二進制數據中1的個數是奇數為依據,則是奇校驗
    發表于 07-31 17:35 ?4次下載
    奇偶<b class='flag-5'>校驗</b>是什么

    數據是如何使VPN成為強大工具

    隨著時間的推移,大數據已經使VPN成為強大的隱私工具。而即使到現在,這種情況仍在持續。
    發表于 03-12 15:22 ?1278次閱讀

    單片機通信數據校驗

    單片機通信數據校驗
    發表于 11-23 17:36 ?33次下載
    單片機通信<b class='flag-5'>數據</b><b class='flag-5'>校驗</b>

    工控常用LRC XOR累加和CRC校驗工具校驗碼自動生成軟件多計算方式

    CRC校驗工具 校驗碼自動生成軟件支持十幾種CRC計算方式,包括MODBUS協議的CRC-16校驗,CRC4、CRC5、CRC6、CRC7、CRC8、CRC16等21種算法,見圖示。兩
    的頭像 發表于 11-25 14:27 ?3614次閱讀
    工控常用LRC XOR累加和CRC<b class='flag-5'>校驗</b><b class='flag-5'>工具</b><b class='flag-5'>校驗</b>碼自動生成軟件多計算方式

    什么是奇校驗和偶校驗?常見的奇偶校驗方式有哪些?

    什么是奇校驗和偶校驗?常見的奇偶校驗方式有哪些? 1. 奇偶校驗是指在數字通信中采用一種技術對傳輸的數據進行
    的頭像 發表于 10-17 16:28 ?1.1w次閱讀

    奇偶校驗和crc校驗的區別 CRC校驗和奇偶校驗之間有什么關系?

    奇偶校驗和crc校驗的區別 CRC校驗和奇偶校驗之間有什么關系? 奇偶校驗和 CRC(Cyclic Redundancy Check)
    的頭像 發表于 10-17 16:28 ?3504次閱讀
    主站蜘蛛池模板: 午夜在线网站 | 欧美一级在线观看视频 | 亚洲人成77777在线观看网 | 偷偷操不一样的久久 | 女a男0攻巨肉高h | 日本黄页网 | 欧美黑人性色黄在线视频 | 国产白白白在线永久播放 | 欧美人另类zooz | 国产乱码免费卡1卡二卡3卡四 | 四虎亚洲精品 | 青青青久97在线观看香蕉 | 亚色中文 | 色噜噜狠狠狠综合曰曰曰 | 国产中文99视频在线观看 | 欧美色惰aⅴ| 亚洲精品电影天堂网 | 国产成人精品亚洲77美色 | 天天搞夜夜爽 | 天堂中文在线资源 | 国产精品 视频一区 二区三区 | xxxxxhd69日本护士 | 最近2018年中文字幕大全一 | 久草视频在线免费看 | 91夜夜人人揉人人捏人人添 | 亚洲一区欧美二区 | 色狠狠一区二区 | 日本特黄特色 | 曰本毛片| 国产欧美一区二区三区观看 | 五月婷婷色视频 | 米奇影院777 | 午夜精品视频在线 | www.色图| 男女视频在线播放 | 啪啪免费观看 | 一区二区免费视频 | 天堂中文在线资源库用 | 婷婷久操| 色婷婷99综合久久久精品 | 三级全黄a |