欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python庫(kù)pydantic的簡(jiǎn)易入門(mén)教程

 更新時(shí)間:2022年03月28日 16:23:56   作者:青火_  
pydantic庫(kù)是一種常用的用于數(shù)據(jù)接口schema定義與檢查的庫(kù),通過(guò)pydantic庫(kù),我們可以更為規(guī)范地定義和使用數(shù)據(jù)接口,下面這篇文章主要給大家介紹了關(guān)于python庫(kù)pydantic的簡(jiǎn)易入門(mén)教程,需要的朋友可以參考下

一、簡(jiǎn)介

pydantic 庫(kù)是 python 中用于數(shù)據(jù)接口定義檢查與設(shè)置管理的庫(kù)。

pydantic 在運(yùn)行時(shí)強(qiáng)制執(zhí)行類(lèi)型提示,并在數(shù)據(jù)無(wú)效時(shí)提供友好的錯(cuò)誤。

它具有如下優(yōu)點(diǎn):

  • 與 IDE/linter 完美搭配,不需要學(xué)習(xí)新的模式,只是使用類(lèi)型注解定義類(lèi)的實(shí)例
  • 多用途,BaseSettings 既可以驗(yàn)證請(qǐng)求數(shù)據(jù),也可以從環(huán)境變量中讀取系統(tǒng)設(shè)置
  • 快速
  • 可以驗(yàn)證復(fù)雜結(jié)構(gòu)
  • 可擴(kuò)展,可以使用validator裝飾器裝飾的模型上的方法來(lái)擴(kuò)展驗(yàn)證
  • 數(shù)據(jù)類(lèi)集成,除了BaseModel,pydantic還提供了一個(gè)dataclass裝飾器,它創(chuàng)建帶有輸入數(shù)據(jù)解析和驗(yàn)證的普通 Python 數(shù)據(jù)類(lèi)。

二、安裝

pip install pydantic

要測(cè)試 pydantic 是否已編譯,請(qǐng)運(yùn)行:

import pydantic
print('compiled:', pydantic.compiled)

支持使用dotenv文件獲取配置,需要安裝 python-dotenv

pip install pydantic[dotenv]

三、常見(jiàn)模型

pydantic中定義對(duì)象都是通過(guò)模型的,你可以認(rèn)為模型就是類(lèi)型語(yǔ)言中的類(lèi)型。

1、BaseModel 基本模型

from pydantic import BaseModel
class User(BaseModel):
    id: int
    name = 'Jane Doe'

上面的例子,定義了一個(gè)User模型,繼承自BaseModel,有2個(gè)字段,id是一個(gè)整數(shù)并且是必需的,name是一個(gè)帶有默認(rèn)值的字符串并且不是必需的

實(shí)例化使用:

user = User(id='123')

實(shí)例化將執(zhí)行所有解析和驗(yàn)證,如果有錯(cuò)誤則會(huì)觸發(fā) ValidationError 報(bào)錯(cuò)。

模型具有以下屬性:

  • dict() 模型字段和值的字典

  • json() JSON 字符串表示dict()

  • copy() 模型的副本(默認(rèn)為淺表副本)

  • parse_obj() 使用dict解析數(shù)據(jù)

  • parse_raw 將str或bytes并將其解析為json,然后將結(jié)果傳遞給parse_obj

  • parse_file 文件路徑,讀取文件并將內(nèi)容傳遞給parse_raw。如果content_type省略,則從文件的擴(kuò)展名推斷

  • from_orm() 從ORM 對(duì)象創(chuàng)建模型

  • schema() 返回模式的字典

  • schema_json() 返回該字典的 JSON 字符串表示

  • construct() 允許在沒(méi)有驗(yàn)證的情況下創(chuàng)建模型

  • __fields_set__ 初始化模型實(shí)例時(shí)設(shè)置的字段名稱(chēng)集

  • __fields__ 模型字段的字典

  • __config__ 模型的配置類(lèi)

2、遞歸模型

可以使用模型本身作為注釋中的類(lèi)型來(lái)定義更復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。

from typing import List
from pydantic import BaseModel

class Foo(BaseModel):
    count: int
    size: float = None

class Bar(BaseModel):
    apple = 'x'
    banana = 'y'

class Spam(BaseModel):
    foo: Foo
    bars: List[Bar]

3、GenericModel 通用模型(泛型):

使用 typing.TypeVar 的實(shí)例作為參數(shù),傳遞給 typing.Generic,然后在繼承了pydantic.generics.GenericModel 的模型中使用:

from typing import Generic, TypeVar, Optional, List

from pydantic import BaseModel, validator, ValidationError
from pydantic.generics import GenericModel

DataT = TypeVar('DataT')

class Error(BaseModel):
    code: int
    message: str

class DataModel(BaseModel):
    numbers: List[int]
    people: List[str]

class Response(GenericModel, Generic[DataT]):
    data: Optional[DataT]
    error: Optional[Error]

    @validator('error', always=True)
    def check_consistency(cls, v, values):
        if v is not None and values['data'] is not None:
            raise ValueError('must not provide both data and error')
        if v is None and values.get('data') is None:
            raise ValueError('must provide data or error')
        return v

data = DataModel(numbers=[1, 2, 3], people=[])
error = Error(code=404, message='Not found')

print(Response[int](data=1))
#> data=1 error=None
print(Response[str](data='value'))
#> data='value' error=None
print(Response[str](data='value').dict())
#> {'data': 'value', 'error': None}
print(Response[DataModel](data=data).dict())
"""
{
    'data': {'numbers': [1, 2, 3], 'people': []},
    'error': None,
}
"""
print(Response[DataModel](error=error).dict())
"""
{
    'data': None,
    'error': {'code': 404, 'message': 'Not found'},
}
"""
try:
    Response[int](data='value')
except ValidationError as e:
    print(e)
    """
    2 validation errors for Response[int]
    data
      value is not a valid integer (type=type_error.integer)
    error
      must provide data or error (type=value_error)
    """

4、create_model 動(dòng)態(tài)模型

在某些情況下,直到運(yùn)行時(shí)才知道模型的結(jié)構(gòu)。為此 pydantic 提供了create_model允許動(dòng)態(tài)創(chuàng)建模型的方法。

from pydantic import BaseModel, create_model
DynamicFoobarModel = create_model('DynamicFoobarModel', foo=(str, ...), bar=123)

四、常用類(lèi)型

  • None,type(None)或Literal[None]只允許None值

  • bool 布爾類(lèi)型

  • int 整數(shù)類(lèi)型

  • float 浮點(diǎn)數(shù)類(lèi)型

  • str 字符串類(lèi)型

  • bytes 字節(jié)類(lèi)型

  • list 允許list,tuple,set,frozenset,deque, 或生成器并轉(zhuǎn)換為列表

  • tuple 允許list,tuple,set,frozenset,deque, 或生成器并轉(zhuǎn)換為元組

  • dict 字典類(lèi)型

  • set 允許list,tuple,set,frozenset,deque, 或生成器和轉(zhuǎn)換為集合;

  • frozenset 允許list,tuple,set,frozenset,deque, 或生成器和強(qiáng)制轉(zhuǎn)換為凍結(jié)集

  • deque 允許list,tuple,set,frozenset,deque, 或生成器和強(qiáng)制轉(zhuǎn)換為雙端隊(duì)列

  • datetime 的date,datetime,time,timedelta 等日期類(lèi)型

  • typing 中的 Deque, Dict, FrozenSet, List, Optional, Sequence, Set, Tuple, Union,Callable,Pattern等類(lèi)型

  • FilePath,文件路徑

  • DirectoryPath 目錄路徑

  • EmailStr 電子郵件地址

  • NameEmail 有效的電子郵件地址或格式

  • PyObject 需要一個(gè)字符串并加載可在該虛線路徑中導(dǎo)入的 python 對(duì)象;

  • Color 顏色類(lèi)型

  • AnyUrl 任意網(wǎng)址

  • SecretStr、SecretBytes 敏感信息,將被格式化為'**********'或''

  • Json 類(lèi)型

  • PaymentCardNumber 支付卡類(lèi)型

  • 約束類(lèi)型,可以使用con*類(lèi)型函數(shù)限制許多常見(jiàn)類(lèi)型的值

    • conlist
  • item_type: Type[T]: 列表項(xiàng)的類(lèi)型
  • min_items: int = None: 列表中的最小項(xiàng)目數(shù)
  • max_items: int = None: 列表中的最大項(xiàng)目數(shù)
  • conset
  • item_type: Type[T]: 設(shè)置項(xiàng)目的類(lèi)型
  • min_items: int = None: 集合中的最小項(xiàng)目數(shù)
  • max_items: int = None: 集合中的最大項(xiàng)目數(shù)
  • conint
  • strict: bool = False: 控制類(lèi)型強(qiáng)制
  • gt: int = None: 強(qiáng)制整數(shù)大于設(shè)定值
  • ge: int = None: 強(qiáng)制整數(shù)大于或等于設(shè)定值
  • lt: int = None: 強(qiáng)制整數(shù)小于設(shè)定值
  • le: int = None: 強(qiáng)制整數(shù)小于或等于設(shè)定值
  • multiple_of: int = None: 強(qiáng)制整數(shù)為設(shè)定值的倍數(shù)
  • confloat
  • strict: bool = False: 控制類(lèi)型強(qiáng)制
  • gt: float = None: 強(qiáng)制浮點(diǎn)數(shù)大于設(shè)定值
  • ge: float = None: 強(qiáng)制 float 大于或等于設(shè)定值
  • lt: float = None: 強(qiáng)制浮點(diǎn)數(shù)小于設(shè)定值
  • le: float = None: 強(qiáng)制 float 小于或等于設(shè)定值
  • multiple_of: float = None: 強(qiáng)制 float 為設(shè)定值的倍數(shù)
  • condecimal
  • gt: Decimal = None: 強(qiáng)制十進(jìn)制大于設(shè)定值
  • ge: Decimal = None: 強(qiáng)制十進(jìn)制大于或等于設(shè)定值
  • lt: Decimal = None: 強(qiáng)制十進(jìn)制小于設(shè)定值
  • le: Decimal = None: 強(qiáng)制十進(jìn)制小于或等于設(shè)定值
  • max_digits: int = None: 小數(shù)點(diǎn)內(nèi)的最大位數(shù)。它不包括小數(shù)點(diǎn)前的零或尾隨的十進(jìn)制零
  • decimal_places: int = None: 允許的最大小數(shù)位數(shù)。它不包括尾隨十進(jìn)制零
  • multiple_of: Decimal = None: 強(qiáng)制十進(jìn)制為設(shè)定值的倍數(shù)
  • constr
  • strip_whitespace: bool = False: 刪除前尾空格
  • to_lower: bool = False: 將所有字符轉(zhuǎn)為小寫(xiě)
  • strict: bool = False: 控制類(lèi)型強(qiáng)制
  • min_length: int = None: 字符串的最小長(zhǎng)度
  • max_length: int = None: 字符串的最大長(zhǎng)度
  • curtail_length: int = None: 當(dāng)字符串長(zhǎng)度超過(guò)設(shè)定值時(shí),將字符串長(zhǎng)度縮小到設(shè)定值
  • regex: str = None: 正則表達(dá)式來(lái)驗(yàn)證字符串
  • conbytes
  • strip_whitespace: bool = False: 刪除前尾空格
  • to_lower: bool = False: 將所有字符轉(zhuǎn)為小寫(xiě)
  • min_length: int = None: 字節(jié)串的最小長(zhǎng)度
  • max_length: int = None: 字節(jié)串的最大長(zhǎng)度
  • 嚴(yán)格類(lèi)型,您可以使用StrictStr,StrictBytes,StrictInt,StrictFloat,和StrictBool類(lèi)型,以防止強(qiáng)制兼容類(lèi)型

五、驗(yàn)證器

使用validator裝飾器可以實(shí)現(xiàn)自定義驗(yàn)證和對(duì)象之間的復(fù)雜關(guān)系。

from pydantic import BaseModel, ValidationError, validator

class UserModel(BaseModel):
    name: str
    username: str
    password1: str
    password2: str

    @validator('name')
    def name_must_contain_space(cls, v):
        if ' ' not in v:
            raise ValueError('must contain a space')
        return v.title()

    @validator('password2')
    def passwords_match(cls, v, values, **kwargs):
        if 'password1' in values and v != values['password1']:
            raise ValueError('passwords do not match')
        return v

    @validator('username')
    def username_alphanumeric(cls, v):
        assert v.isalnum(), 'must be alphanumeric'
        return v

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

關(guān)于驗(yàn)證器的一些注意事項(xiàng):

  • 驗(yàn)證器是“類(lèi)方法”,因此它們接收的第一個(gè)參數(shù)值是UserModel類(lèi),而不是UserModel
  • 第二個(gè)參數(shù)始終是要驗(yàn)證的字段值,可以隨意命名
  • 單個(gè)驗(yàn)證器可以通過(guò)傳遞多個(gè)字段名稱(chēng)來(lái)應(yīng)用于多個(gè)字段,也可以通過(guò)傳遞特殊值在所有字段上調(diào)用單個(gè)驗(yàn)證器'*'
  • 關(guān)鍵字參數(shù)pre將導(dǎo)致在其他驗(yàn)證之前調(diào)用驗(yàn)證器
  • 通過(guò)each_item=True將導(dǎo)致驗(yàn)證器被施加到單獨(dú)的值(例如List,Dict,Set等),而不是整個(gè)對(duì)象
from typing import List
from pydantic import BaseModel, ValidationError, validator

class ParentModel(BaseModel):
    names: List[str]

class ChildModel(ParentModel):
    @validator('names', each_item=True)
    def check_names_not_empty(cls, v):
        assert v != '', 'Empty strings are not allowed.'
        return v

# This will NOT raise a ValidationError because the validator was not called
try:
    child = ChildModel(names=['Alice', 'Bob', 'Eve', ''])
except ValidationError as e:
    print(e)
else:
    print('No ValidationError caught.')
    #> No ValidationError caught.


class ChildModel2(ParentModel):
    @validator('names')
    def check_names_not_empty(cls, v):
        for name in v:
            assert name != '', 'Empty strings are not allowed.'
        return v

try:
    child = ChildModel2(names=['Alice', 'Bob', 'Eve', ''])
except ValidationError as e:
    print(e)
    """
    1 validation error for ChildModel2
    names
      Empty strings are not allowed. (type=assertion_error)
    """
  • 關(guān)鍵字參數(shù) always 將導(dǎo)致始終驗(yàn)證,出于性能原因,默認(rèn)情況下,當(dāng)未提供值時(shí),不會(huì)為字段調(diào)用驗(yàn)證器。然而,在某些情況下,始終調(diào)用驗(yàn)證器可能很有用或需要,例如設(shè)置動(dòng)態(tài)默認(rèn)值。
  • allow_reuse 可以在多個(gè)字段/模型上使用相同的驗(yàn)證器
from pydantic import BaseModel, validator

def normalize(name: str) -> str:
    return ' '.join((word.capitalize()) for word in name.split(' '))

class Producer(BaseModel):
    name: str

    # validators
    _normalize_name = validator('name', allow_reuse=True)(normalize)

class Consumer(BaseModel):
    name: str
    # validators
    _normalize_name = validator('name', allow_reuse=True)(normalize)

六、配置

如果您創(chuàng)建一個(gè)繼承自BaseSettings的模型,模型初始化程序?qū)L試通過(guò)從環(huán)境中讀取,來(lái)確定未作為關(guān)鍵字參數(shù)傳遞的任何字段的值。(如果未設(shè)置匹配的環(huán)境變量,則仍將使用默認(rèn)值。)

這使得很容易:

  • 創(chuàng)建明確定義、類(lèi)型提示的應(yīng)用程序配置類(lèi)
  • 自動(dòng)從環(huán)境變量中讀取對(duì)配置的修改
  • 在需要的地方手動(dòng)覆蓋初始化程序中的特定設(shè)置(例如在單元測(cè)試中)
from typing import Set

from pydantic import (
    BaseModel,
    BaseSettings,
    PyObject,
    RedisDsn,
    PostgresDsn,
    Field,
)

class SubModel(BaseModel):
    foo = 'bar'
    apple = 1

class Settings(BaseSettings):
    auth_key: str
    api_key: str = Field(..., env='my_api_key')

    redis_dsn: RedisDsn = 'redis://user:pass@localhost:6379/1'
    pg_dsn: PostgresDsn = 'postgres://user:pass@localhost:5432/foobar'

    special_function: PyObject = 'math.cos'

    # to override domains:
    # export my_prefix_domains='["foo.com", "bar.com"]'
    domains: Set[str] = set()

    # to override more_settings:
    # export my_prefix_more_settings='{"foo": "x", "apple": 1}'
    more_settings: SubModel = SubModel()

    class Config:
        env_prefix = 'my_prefix_'  # defaults to no prefix, i.e. ""
        fields = {
            'auth_key': {
                'env': 'my_auth_key',
            },
            'redis_dsn': {
                'env': ['service_redis_dsn', 'redis_url']
            }
        }

print(Settings().dict())
"""
{
    'auth_key': 'xxx',
    'api_key': 'xxx',
    'redis_dsn': RedisDsn('redis://user:pass@localhost:6379/1',
scheme='redis', user='user', password='pass', host='localhost',
host_type='int_domain', port='6379', path='/1'),
    'pg_dsn': PostgresDsn('postgres://user:pass@localhost:5432/foobar',
scheme='postgres', user='user', password='pass', host='localhost',
host_type='int_domain', port='5432', path='/foobar'),
    'special_function': <built-in function cos>,
    'domains': set(),
    'more_settings': {'foo': 'bar', 'apple': 1},
}
"""

支持 Dotenv 文件設(shè)置變量,pydantic 有兩種方式加載它:

class Settings(BaseSettings):
    ...

    class Config:
        env_file = '.env'
        env_file_encoding = 'utf-8'

或者

settings=Settings(_env_file='prod.env',_env_file_encoding='utf-8')

即使使用 dotenv 文件,pydantic 仍會(huì)讀取環(huán)境變量,環(huán)境變量將始終優(yōu)先于從 dotenv 文件加載的值。

pydantic 支持設(shè)置敏感信息文件,同樣有2種方式加載:

class Settings(BaseSettings):
    ...
    database_password: str
    class Config:
        secrets_dir = '/var/run'

或者:

settings = Settings(_secrets_dir='/var/run')

即使使用 secrets 目錄,pydantic仍會(huì)從 dotenv 文件或環(huán)境中讀取環(huán)境變量,dotenv 文件和環(huán)境變量將始終優(yōu)先于從 secrets 目錄加載的值。

七、與 mypy 一起使用

Pydantic 附帶了一個(gè) mypy 插件,向 mypy 添加了許多重要的特定于 pydantic 的功能,以提高其對(duì)代碼進(jìn)行類(lèi)型檢查的能力。

例如以下腳本:

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

class Model(BaseModel):
    age: int
    first_name = 'John'
    last_name: NoneStr = None
    signup_ts: Optional[datetime] = None
    list_of_ints: List[int]

m = Model(age=42, list_of_ints=[1, '2', b'3'])
print(m.middle_name)  # not a model field!
Model()  # will raise a validation error for age and list_of_ints

在沒(méi)有任何特殊配置的情況下,mypy 會(huì)捕獲其中一個(gè)錯(cuò)誤:

13: error: "Model" has no attribute "middle_name"

啟用插件后,它會(huì)同時(shí)捕獲:

13: error: "Model" has no attribute "middle_name"
16: error: Missing named argument "age" for "Model"
16: error: Missing named argument "list_of_ints" for "Model"

要啟用該插件,只需添加pydantic.mypy到mypy 配置文件中的插件列表:

[mypy]
plugins = pydantic.mypy

要更改插件設(shè)置的值,請(qǐng)??在 mypy 配置文件中創(chuàng)建一個(gè)名為 的部分[pydantic-mypy],并為要覆蓋的設(shè)置添加鍵值對(duì):

[mypy]
plugins = pydantic.mypy

follow_imports = silent
warn_redundant_casts = True
warn_unused_ignores = True
disallow_any_generics = True
check_untyped_defs = True
no_implicit_reexport = True

# for strict mypy: (this is the tricky one :-))
disallow_untyped_defs = True

[pydantic-mypy]
init_forbid_extra = True
init_typed = True
warn_required_dynamic_aliases = True
warn_untyped_fields = True

總結(jié)

到此這篇關(guān)于python庫(kù)pydantic簡(jiǎn)易入門(mén)的文章就介紹到這了,更多相關(guān)python庫(kù)pydantic教程內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于Python實(shí)現(xiàn)語(yǔ)音合成小工具

    基于Python實(shí)現(xiàn)語(yǔ)音合成小工具

    TTS(Text To Speech)是一種語(yǔ)音合成技術(shù),可以讓機(jī)器將輸入文本以語(yǔ)音的方式播放出來(lái),實(shí)現(xiàn)機(jī)器說(shuō)話的效果。本文將使用pyttsx3庫(kù)作為示范,編寫(xiě)一個(gè)語(yǔ)音合成小工具,感興趣的可以了解一下
    2022-12-12
  • Python性能分析工具Profile使用實(shí)例

    Python性能分析工具Profile使用實(shí)例

    這篇文章主要介紹了Python性能分析工具Profile使用實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • Python編程實(shí)現(xiàn)及時(shí)獲取新郵件的方法示例

    Python編程實(shí)現(xiàn)及時(shí)獲取新郵件的方法示例

    這篇文章主要介紹了Python編程實(shí)現(xiàn)及時(shí)獲取新郵件的方法,涉及Python實(shí)時(shí)查詢(xún)郵箱及郵件獲取相關(guān)操作技巧,需要的朋友可以參考下
    2017-08-08
  • Django rest framework jwt的使用方法詳解

    Django rest framework jwt的使用方法詳解

    這篇文章主要介紹了Django rest framework jwt的使用方法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • Python命令行參數(shù)解析模塊getopt使用實(shí)例

    Python命令行參數(shù)解析模塊getopt使用實(shí)例

    這篇文章主要介紹了Python命令行參數(shù)解析模塊getopt使用實(shí)例,本文講解了使用語(yǔ)法格式、短選項(xiàng)參數(shù)實(shí)例、長(zhǎng)選項(xiàng)參數(shù)實(shí)例等內(nèi)容,需要的朋友可以參考下
    2015-04-04
  • Python中跳臺(tái)階、變態(tài)跳臺(tái)階與矩形覆蓋問(wèn)題的解決方法

    Python中跳臺(tái)階、變態(tài)跳臺(tái)階與矩形覆蓋問(wèn)題的解決方法

    這篇文章主要給大家介紹了關(guān)于Python中跳臺(tái)階、變態(tài)跳臺(tái)階與矩形覆蓋問(wèn)題的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-05-05
  • CentOS 6.5中安裝Python 3.6.2的方法步驟

    CentOS 6.5中安裝Python 3.6.2的方法步驟

    centos 6.5默認(rèn)自帶的python版本為2.6,而下面這篇文章主要給大家介紹了關(guān)于在CentOS 6.5中安裝Python 3.6.2的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-12-12
  • Python如何使用WebSocket實(shí)現(xiàn)實(shí)時(shí)Web應(yīng)用

    Python如何使用WebSocket實(shí)現(xiàn)實(shí)時(shí)Web應(yīng)用

    這篇文章主要介紹了Python使用WebSocket實(shí)現(xiàn)實(shí)時(shí)Web應(yīng)用,Django?Channels?提供了強(qiáng)大的功能,使得在?Django?中實(shí)現(xiàn)實(shí)時(shí)功能變得更加容易,你可以在此基礎(chǔ)上擴(kuò)展,添加更多功能和復(fù)雜的邏輯,需要的朋友可以參考下
    2024-08-08
  • Python 3中的yield from語(yǔ)法詳解

    Python 3中的yield from語(yǔ)法詳解

    在python 3.3里,generator新增了一個(gè)語(yǔ)法 yield from,這個(gè)yield from的作用是什么?語(yǔ)法是什么呢?下面通過(guò)這篇文章主要給大家詳細(xì)介紹了Python 3中yield from語(yǔ)法的相關(guān)資料,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-01-01
  • python高級(jí)特性簡(jiǎn)介

    python高級(jí)特性簡(jiǎn)介

    這篇文章主要介紹了python高級(jí)特性的相關(guān)內(nèi)容,其中包括切片,迭代,列表生成式,生成器,迭代器,感興趣的朋友可以了解下
    2020-08-08

最新評(píng)論