最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

PyYAML SafeLoader的使用小結

 更新時間:2026年03月22日 10:21:25   作者:Yorlen_Zhang  
yaml.SafeLoader 是處理配置文件的黃金標準,它在保證安全的同時提供了完整的 YAML 功能支持,下面就來介紹一下PyYAML SafeLoader如何使用,感興趣的可以了解一下

yaml.SafeLoader是 PyYAML 庫中最推薦使用的 YAML 解析器,它在功能性和安全性之間取得了完美平衡。本文將深入介紹其核心特性、使用方法及最佳實踐。

一、為什么選擇 SafeLoader?

PyYAML 提供了多種 Loader,但 SafeLoader 是生產環(huán)境的首選:

Loader 類型安全性功能支持適用場景
SafeLoader??? 高基礎類型生產環(huán)境首選
FullLoader?? 中大部分 Python 對象受信任文件
UnsafeLoader? 低任意 Python 對象避免使用
Loader (默認)? 低同 UnsafeLoader已廢棄

核心優(yōu)勢:

  • 安全性:禁止執(zhí)行任意 Python 代碼,防范反序列化攻擊
  • 標準兼容:完整支持 YAML 1.1 規(guī)范
  • 類型安全:僅解析基本數據類型(字典、列表、字符串、數字等)

二、基礎使用方法

1. 基本加載

import yaml

# 方法1:顯式指定 SafeLoader(推薦)
with open('config.yaml', 'r', encoding='utf-8') as f:
    data = yaml.load(f, Loader=yaml.SafeLoader)

# 方法2:使用安全加載快捷函數(更簡潔)
with open('config.yaml', 'r', encoding='utf-8') as f:
    data = yaml.safe_load(f)  # 內部使用 SafeLoader

# 字符串加載
yaml_text = """
name: 張三
age: 28
skills:
  - Python
  - YAML
"""
data = yaml.safe_load(yaml_text)
print(data)

# {'name': '張三', 'age': 28, 'skills': ['Python', 'YAML']}

2. 多文檔處理

# 處理多個 YAML 文檔(--- 分隔)
multi_doc = """
---
name: 文檔1
value: 100
---
name: 文檔2
value: 200
"""
# 生成器方式遍歷所有文檔
for doc in yaml.safe_load_all(multi_doc):
    print(doc)

三、支持的 YAML 類型映射

SafeLoader 將 YAML 類型安全地轉換為 Python 對象:

YAML 類型Python 類型示例
映射 (Mapping)dictkey: value
序列 (Sequence)list- item1
字符串 (Str)str"text" 或 text
整數 (Int)int42, 0x2A
浮點數 (Float)float3.14, 6.02e23
布爾值 (Bool)booltrue, false
空值 (Null)Nonenull, ~
時間戳 (Timestamp)datetime.datetime2024-01-15
二進制 (Binary)bytes!!binary "SGVsbG8="

?? 不支持的危險類型(被安全限制):

  • !!python/object - 任意 Python 對象
  • !!python/module - 模塊導入
  • !!python/execute - 代碼執(zhí)行

四、高級配置與自定義

1. 自定義構造器(安全擴展)

import yaml
from yaml import SafeLoader

# 添加自定義標簽處理(保持安全邊界)
class MySafeLoader(SafeLoader):
    pass

# 注冊自定義構造器
def constructor_env_variable(loader, node):
    value = loader.construct_scalar(node)
    return os.path.expandvars(value)  # 展開環(huán)境變量

# 注冊 !!env 標簽
MySafeLoader.add_constructor('!env', constructor_env_variable)

# 使用自定義 Loader
yaml_text = "path: !env $HOME/config"
data = yaml.load(yaml_text, Loader=MySafeLoader)

2. 安全加載與驗證結合

from pydantic import BaseModel
import yaml

class Config(BaseModel):
    name: str
    port: int
    debug: bool = False

# 安全加載 + 模式驗證
with open('config.yaml') as f:
    raw_data = yaml.safe_load(f)
    config = Config(**raw_data)  # 驗證類型安全

五、常見陷阱與解決方案

陷阱 1:隱式類型轉換

# 危險:version 會被解析為字符串 "1.10" 還是數字?
version: 1.10      # 實際解析為浮點數 1.1
date: 2024-01-15  # 解析為日期對象,不是字符串!

解決方案:

# 強制字符串類型
version: !!str 1.10
date: !!str 2024-01-15

陷阱 2:YAML 別名循環(huán)引用

# 無限遞歸定義(SafeLoader 可安全處理,但需注意)
person: &anchor
  name: 張三
  friend: *anchor  # 循環(huán)引用

處理:

# SafeLoader 會正確解析為自引用對象
# 使用 copy.deepcopy 時需設置最大深度防棧溢出
import copy
data = yaml.safe_load(yaml_text)
safe_copy = copy.deepcopy(data)  # 可能拋出 RecursionError

六、最佳實踐總結

  • 永遠使用 safe_load:替代 load() 避免安全風險
  • 顯式聲明字符串:對版本號、電話號碼等使用 !!str 強制類型
  • 限制文件權限:YAML 配置文件應只讀(chmod 644)
  • 輸入驗證:加載后使用 Pydantic 或 JSON Schema 驗證結構
  • 錯誤處理:捕獲 yaml.YAMLError 解析異常
import yaml
from yaml import YAMLError
try:
    with open('config.yaml', 'r', encoding='utf-8') as f:
        config = yaml.safe_load(f)
except YAMLError as e:
    print(f"YAML 解析錯誤: {e}")
except FileNotFoundError:
    print("配置文件不存在")

yaml.SafeLoader 是處理配置文件的黃金標準,它在保證安全的同時提供了完整的 YAML 功能支持,是現代 Python 項目的必備工具。

到此這篇關于PyYAML SafeLoader的使用小結的文章就介紹到這了,更多相關PyYAML SafeLoader 內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Python解析微信dat文件的方法

    Python解析微信dat文件的方法

    這篇文章主要介紹了Python解析微信dat文件的方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • 關于tensorflow和keras版本的對應關系

    關于tensorflow和keras版本的對應關系

    這篇文章主要介紹了關于tensorflow和keras版本的對應關系,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • 一文詳解如何用GPU來運行Python代碼

    一文詳解如何用GPU來運行Python代碼

    前幾天搗鼓了一下Ubuntu,正是想用一下我舊電腦上的N卡,可以用GPU來跑代碼,體驗一下多核的快樂,感興趣的小伙伴快跟隨小編一起了解一下吧
    2023-02-02
  • python 普通克里金(Kriging)法的實現

    python 普通克里金(Kriging)法的實現

    這篇文章主要介紹了python 普通克里金(Kriging)法的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-12-12
  • pytorch之scatter_的用法及說明

    pytorch之scatter_的用法及說明

    這篇文章主要介紹了pytorch之scatter_的用法及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • 如何在python中使用openpyxl庫讀寫Excel.xlsx文件(有參考列程)

    如何在python中使用openpyxl庫讀寫Excel.xlsx文件(有參考列程)

    這篇文章主要給大家介紹了關于如何在python中使用openpyxl庫讀寫Excel.xlsx文件的相關資料,openpyxl是一個第三方庫,可以處理xlsx格式的Excel文件,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-06-06
  • 使用Python實現Excel文件轉換為SVG格式

    使用Python實現Excel文件轉換為SVG格式

    SVG(Scalable Vector Graphics)是一種基于XML的矢量圖像格式,這種格式在Web開發(fā)和其他圖形應用中非常流行,提供了一種高效的方式來呈現復雜的矢量圖形,本文將介紹如何使用Python轉換Excel文件為SVG格式,需要的朋友可以參考下
    2024-07-07
  • Python 面向對象 成員的訪問約束

    Python 面向對象 成員的訪問約束

    在Java,C++,以及PHP中都有對應的關鍵字,public,protected,private,但是在Python中卻沒有這些關鍵字來聲明類成員的訪問作用域。
    2008-12-12
  • 對Python2與Python3中__bool__方法的差異詳解

    對Python2與Python3中__bool__方法的差異詳解

    今天小編就為大家分享一篇對Python2與Python3中__bool__方法的差異詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-11-11
  • 解決Python 異常TypeError: cannot concatenate ''str'' and ''int'' objects

    解決Python 異常TypeError: cannot concatenate ''str'' and ''int''

    這篇文章主要介紹了解決Python 異常TypeError: cannot concatenate 'str' and 'int' objects,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04

最新評論

锡林郭勒盟| 兴业县| 教育| 裕民县| 玉树县| 孟村| 阿勒泰市| 北流市| 阿克苏市| 会同县| 贺兰县| 乌拉特后旗| 清水县| 余姚市| 淅川县| 萨嘎县| 淮滨县| 犍为县| 陇西县| 安西县| 高平市| 宝应县| 古浪县| 紫阳县| 城步| 四子王旗| 郓城县| 宁津县| 旌德县| 利辛县| 微山县| 溧阳市| 七台河市| 磐石市| 湖北省| 会同县| 天长市| 合水县| 上思县| 柘城县| 中阳县|