吴忠躺衫网络科技有限公司

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Pydantic:強(qiáng)大的數(shù)據(jù)校驗(yàn)工具

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

Pydantic 是一個(gè)使用Python類型注解進(jìn)行數(shù)據(jù)驗(yàn)證和管理的模塊。安裝方法非常簡(jiǎn)單,打開終端輸入:

pip install pydantic

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

# Django 序列化器的一個(gè)使用例子,你可以和下面Pydantic的使用作對(duì)比
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以上的類型注解特性,實(shí)現(xiàn)了可以對(duì)任何類做數(shù)據(jù)校驗(yàn)的功能:

上滑查看更多代碼

# Pydantic 數(shù)據(jù)校驗(yàn)功能
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',
}
"""

從上面的基本使用可以看到,它甚至能自動(dòng)幫你做數(shù)據(jù)類型的轉(zhuǎn)換,比如代碼中的 user.id, 在字典中是字符串,但經(jīng)過Pydantic校驗(yàn)器后,它自動(dòng)變成了int型,因?yàn)閁ser類里的注解就是int型。

當(dāng)我們的數(shù)據(jù)和定義的注解類型不一致時(shí)會(huì)報(bào)這樣的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", 因?yàn)槲覀魅氲?signup_ts 不是標(biāo)準(zhǔn)的時(shí)間格式(多了個(gè)2)。

1. Pydantic模型數(shù)據(jù)導(dǎo)出 ****

通過Pydantic模型中自帶的 json 屬性方法,能讓經(jīng)過校驗(yàn)后的數(shù)據(jù)一行命令直接轉(zhuǎn)成 json 字符串,如前文中的 user 對(duì)象:

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

非常方便。它還支持將整個(gè)數(shù)據(jù)結(jié)構(gòu)導(dǎo)出為 schema json,它能完整地描述整個(gè)對(duì)象的數(shù)據(jù)結(jié)構(gòu)類型:

上滑查看更多代碼

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.數(shù)據(jù)導(dǎo)入

除了直接定義數(shù)據(jù)校驗(yàn)?zāi)P停€能通過ORM、字符串、文件導(dǎo)入到數(shù)據(jù)校驗(yàn)?zāi)P停?/p>

比如字符串(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的對(duì)象輸入,轉(zhuǎn)為Pydantic的對(duì)象,比如從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文件導(dǎo)入:

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導(dǎo)入:

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.自定義數(shù)據(jù)校驗(yàn)

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

上滑查看更多代碼

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.導(dǎo)入數(shù)據(jù)集
dataset = pd.read_csv('Social_Network_Ads.csv')
X = dataset.iloc[:, [1, 2, 3]].values
Y = dataset.iloc[:, 4].values

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

# 2.將數(shù)據(jù)集分成訓(xùn)練集和測(cè)試集
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.訓(xùn)練
classifier = LogisticRegression()
classifier.fit(X_train, y_train)

# 5.預(yù)測(cè)
y_pred = classifier.predict(X_test)

# 6.評(píng)估預(yù)測(cè)

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

上面,我們?cè)黾恿巳N自定義校驗(yàn)邏輯:

1.name 必須帶有空格

2.password2 必須和 password1 相同

3.username 必須為字母

讓我們?cè)囋囘@三個(gè)校驗(yàn)是否有效:

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)
    """

可以看到,第一個(gè)UserModel里的數(shù)據(jù)完全沒有問題,通過校驗(yàn)。

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

4.性能表現(xiàn)

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

Package版本相對(duì)表現(xiàn)平均耗時(shí)
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
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 模塊
    +關(guān)注

    關(guān)注

    7

    文章

    2735

    瀏覽量

    47753
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    7145

    瀏覽量

    89585
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4828

    瀏覽量

    69058
  • python
    +關(guān)注

    關(guān)注

    56

    文章

    4807

    瀏覽量

    85040
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    實(shí)時(shí)嵌入式系統(tǒng)模型校驗(yàn)技術(shù)

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

    基于Atmega128單片機(jī)和CRC校驗(yàn)碼實(shí)現(xiàn)無線傳輸數(shù)據(jù)時(shí)的差錯(cuò)校驗(yàn)

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

    英飛凌強(qiáng)大的AURIX和工具鏈簡(jiǎn)介

    英飛凌強(qiáng)大的AURIX,工具鏈簡(jiǎn)介,謝謝北京西能提供工具簡(jiǎn)介資料,希望對(duì)學(xué)習(xí)Tricore的童鞋有所指引。Aurix開發(fā)工具鏈20131219.pdf (1.03 MB )
    發(fā)表于 12-14 10:42

    校驗(yàn)遇到數(shù)據(jù)校驗(yàn)不到而導(dǎo)致出錯(cuò)

    串口發(fā)送數(shù)據(jù)時(shí),利用和校驗(yàn)的方法對(duì)數(shù)據(jù)進(jìn)行校驗(yàn),但是遇到數(shù)據(jù)校驗(yàn)不到而導(dǎo)致出錯(cuò),請(qǐng)問這種情況該如
    發(fā)表于 04-14 23:04

    CRC校驗(yàn)代碼自動(dòng)生成工具

    CRC校驗(yàn)代碼自動(dòng)生成工具根據(jù)輸入條件自動(dòng)產(chǎn)生各種CRC的VHDL或verilog源程序
    發(fā)表于 05-20 11:16 ?294次下載
    CRC<b class='flag-5'>校驗(yàn)</b>代碼自動(dòng)生成<b class='flag-5'>工具</b>

    基于Labview的串口通信數(shù)據(jù)校驗(yàn)和的實(shí)現(xiàn)方法

    基于Labview的串口通信數(shù)據(jù)校驗(yàn)和的實(shí)現(xiàn)方法
    發(fā)表于 01-09 17:58 ?173次下載
    基于Labview的串口通信<b class='flag-5'>數(shù)據(jù)</b><b class='flag-5'>校驗(yàn)</b>和的實(shí)現(xiàn)方法

    校驗(yàn)位的小工具

    電子發(fā)燒友網(wǎng)站提供《算校驗(yàn)位的小工具.exe》資料免費(fèi)下載
    發(fā)表于 07-25 16:06 ?2次下載

    文件校驗(yàn)工具

    支持校驗(yàn)文件的MD5SHA-256等值
    發(fā)表于 05-05 08:37 ?16次下載

    循環(huán)冗余校驗(yàn)奇偶校驗(yàn)累加和校驗(yàn)等知識(shí)分享

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

    奇偶校驗(yàn)是什么

    校驗(yàn)依據(jù):判斷傳輸?shù)囊唤M二進(jìn)制數(shù)據(jù)中”1”的個(gè)數(shù)是奇數(shù)還是偶數(shù) 奇校驗(yàn):如果以二進(jìn)制數(shù)據(jù)中1的個(gè)數(shù)是奇數(shù)為依據(jù),則是奇校驗(yàn)
    發(fā)表于 07-31 17:35 ?4次下載
    奇偶<b class='flag-5'>校驗(yàn)</b>是什么

    數(shù)據(jù)是如何使VPN成為強(qiáng)大工具

    隨著時(shí)間的推移,大數(shù)據(jù)已經(jīng)使VPN成為強(qiáng)大的隱私工具。而即使到現(xiàn)在,這種情況仍在持續(xù)。
    發(fā)表于 03-12 15:22 ?1274次閱讀

    單片機(jī)通信數(shù)據(jù)校驗(yàn)

    單片機(jī)通信數(shù)據(jù)校驗(yàn)
    發(fā)表于 11-23 17:36 ?33次下載
    單片機(jī)通信<b class='flag-5'>數(shù)據(jù)</b><b class='flag-5'>校驗(yàn)</b>

    工控常用LRC XOR累加和CRC校驗(yàn)工具校驗(yàn)碼自動(dòng)生成軟件多計(jì)算方式

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

    什么是奇校驗(yàn)和偶校驗(yàn)?常見的奇偶校驗(yàn)方式有哪些?

    什么是奇校驗(yàn)和偶校驗(yàn)?常見的奇偶校驗(yàn)方式有哪些? 1. 奇偶校驗(yàn)是指在數(shù)字通信中采用一種技術(shù)對(duì)傳輸?shù)?b class='flag-5'>數(shù)據(jù)進(jìn)行
    的頭像 發(fā)表于 10-17 16:28 ?1.1w次閱讀

    奇偶校驗(yàn)和crc校驗(yàn)的區(qū)別 CRC校驗(yàn)和奇偶校驗(yàn)之間有什么關(guān)系?

    奇偶校驗(yàn)和crc校驗(yàn)的區(qū)別 CRC校驗(yàn)和奇偶校驗(yàn)之間有什么關(guān)系? 奇偶校驗(yàn)和 CRC(Cyclic Redundancy Check)
    的頭像 發(fā)表于 10-17 16:28 ?3496次閱讀
    波胆| 百家乐官网奥| 太阳会百家乐现金网| 大发888手机真钱游戏| 百家乐官网平台信誉| 百家乐人生信条漫谈| 大发888 dafa888uk.com| 百家乐官网最常见的路子| 百家乐平台信誉排名| bet365娱乐城| 百家乐官网骗局视频| 大发888开户日博备用| 圣安娜百家乐官网包杀合作| 太阳城百家乐祖玛| 奉新县| 网上百家乐的技巧| 足球博彩| 百家乐梅花图标| 大连娱网棋牌步步为赢| 欧洲百家乐官网的玩法技巧和规则 | 百家乐官网vshow| 大发888娱乐场 34| 唐人街百家乐官网的玩法技巧和规则 | 合肥百家乐官网赌博游戏机| 大哥大百家乐的玩法技巧和规则| 雷波县| 任我赢百家乐软件| 百家乐官网玄机| 百家乐平注常赢玩法| 百家乐官网官网7scs| 大发888合营商| 百家乐官网77s| 隆昌县| 百家乐入庄闲概率| 百家乐官网投注庄闲法| 百家乐筹码14克| 玩百家乐官网技巧巧| 澳门美高梅赌场| 百家乐庄闲必胜手段| 如何玩百家乐官网扑克| 百家乐筹码防伪套装|