विषय पर बढ़ें

रहस्य

!!! चेतावनी "🚧 कार्य प्रगति पर है" यह पृष्ठ कार्य प्रगति पर है।

SecretStr और SecretBytes सादे-पाठ के रूप में क्रमबद्ध करें

डिफ़ॉल्ट रूप से, SecretStr और SecretBytes को json पर क्रमबद्ध करते समय ********** के रूप में क्रमबद्ध किया जाएगा।

आप json पर क्रमबद्ध करते समय रहस्य को सादे-पाठ के रूप में डंप करने के लिए field_serializer का उपयोग कर सकते हैं।

from pydantic import BaseModel, SecretBytes, SecretStr, field_serializer


class Model(BaseModel):
    password: SecretStr
    password_bytes: SecretBytes

    @field_serializer('password', 'password_bytes', when_used='json')
    def dump_secret(self, v):
        return v.get_secret_value()


model = Model(password='IAmSensitive', password_bytes=b'IAmSensitiveBytes')
print(model)
#> password=SecretStr('**********') password_bytes=SecretBytes(b'**********')
print(model.password)
#> **********
print(model.model_dump())
"""
{
    'password': SecretStr('**********'),
    'password_bytes': SecretBytes(b'**********'),
}
"""
print(model.model_dump_json())
#> {"password":"IAmSensitive","password_bytes":"IAmSensitiveBytes"}

अपना खुद का गुप्त क्षेत्र बनाएं

पाइडेंटिक कस्टम गुप्त प्रकार बनाने के लिए एक तंत्र के रूप में सामान्य Secret वर्ग प्रदान करता है।

??? एपीआई "एपीआई दस्तावेज़ीकरण" pydantic.types.Secret

पाइडेंटिक कस्टम गुप्त प्रकार बनाने के लिए एक तंत्र के रूप में सामान्य Secret वर्ग प्रदान करता है। आप किसी गुप्त प्रकार के str() और repr() अनुकूलित करने के लिए या तो सीधे Secret पैरामीट्रिज कर सकते हैं, या पैरामीट्रिज्ड Secret से उपवर्ग बना सकते हैं।

from datetime import date

from pydantic import BaseModel, Secret

# Using the default representation
SecretDate = Secret[date]


# Overwriting the representation
class SecretSalary(Secret[float]):
    def _display(self) -> str:
        return '$****.**'


class Employee(BaseModel):
    date_of_birth: SecretDate
    salary: SecretSalary


employee = Employee(date_of_birth='1990-01-01', salary=42)

print(employee)
#> date_of_birth=Secret('**********') salary=SecretSalary('$****.**')

print(employee.salary)
#> $****.**

print(employee.salary.get_secret_value())
#> 42.0

print(employee.date_of_birth)
#> **********

print(employee.date_of_birth.get_secret_value())
#> 1990-01-01

आप एनोटेशन के माध्यम से अंतर्निहित प्रकार पर प्रतिबंध लागू कर सकते हैं: उदाहरण के लिए:

from typing_extensions import Annotated

from pydantic import BaseModel, Field, Secret, ValidationError

SecretPosInt = Secret[Annotated[int, Field(gt=0, strict=True)]]


class Model(BaseModel):
    sensitive_int: SecretPosInt


m = Model(sensitive_int=42)
print(m.model_dump())
#> {'sensitive_int': Secret('**********')}

try:
    m = Model(sensitive_int=-42)  # (1)!
except ValidationError as exc_info:
    print(exc_info.errors(include_url=False, include_input=False))
    """
    [
        {
            'type': 'greater_than',
            'loc': ('sensitive_int',),
            'msg': 'Input should be greater than 0',
            'ctx': {'gt': 0},
        }
    ]
    """

try:
    m = Model(sensitive_int='42')  # (2)!
except ValidationError as exc_info:
    print(exc_info.errors(include_url=False, include_input=False))
    """
    [
        {
            'type': 'int_type',
            'loc': ('sensitive_int',),
            'msg': 'Input should be a valid integer',
        }
    ]
    """
  1. इनपुट मान 0 से अधिक नहीं है, इसलिए यह एक सत्यापन त्रुटि उत्पन्न करता है।
  2. इनपुट मान एक पूर्णांक नहीं है, इसलिए यह एक सत्यापन त्रुटि उत्पन्न करता है क्योंकि SecretPosInt प्रकार में सख्त मोड सक्षम है।

本文总阅读量