Простой Python схема

каталог


инструкции Python схемы

Проект Адрес: GitHub

1. Схема Что это?

Независимо от того, что мы делаем применить, если пользовательский ввод и дело, не существует принцип - никогда не доверяет ввод пользовательских данных. Означает, что мы должны быть строгими проверки пользовательского ввода, общий ввод данных отправляется на веб-разработки бэкэнд API в JSON форме, API сделать проверку входных данных. Я обычно добавляю много суждений, все виды, если, в результате чего в коде очень некрасиво, не может есть более элегантный способ проверки пользовательских данных это? Схема пригождается.

Схема очень проста, это несколько сотен строк кода, это основной класс: Schema.

2. Установить

pip install schema

1. афферентных типов Schema (междунар, ул, поплавок и т.д.)

Например:

from schema import Schema

Schema(int).validate(10)
# 10
Schema(int).validate('10')
# SchemaUnexpectedTypeError: '10' should be instance of 'int'

Проверка схемы будет видна для проверки методы, переданной в типе объекта не задана, то входные данные возвращаются, в противном случае бросило SchemaError из (SchemaUnexpectedTypeError является подклассом SchemaError).

2. Схема к классу входящего объекта (функция с __call__ и т.д.) можно назвать

Например:

Schema(lambda x: 0<x<10).validate(5)
# 5
Schema(lambda x: 0<x<10).validate(57)
# SchemaError: <lambda>(57) should evaluate to True

Пользовательские функции:

def secre_validate(password):
    password_list = ["123456", "666666", "888888", "abcdef", "aaaaaa", "112233"]
    if password in password_list:
        return False
    return True

Schema(secre_validate,  error="字符串已经存在").validate("123456")

# schema.SchemaError: 字符串已经存在

Схема метод проверки будет видно значение, переданное в соответствующей функции внутри передаются в качестве параметров, функция возвращает значение Истина, если входные данные возвращаются, в противном случае возникает исключение.

3. Класс схемы для проверки входящего объекта с помощью метода

Схема также построен ряд классов (использование, и, или и т.д.), являются примерами этих классов с методом валидации также передается в качестве параметра схемы, например:

from schema import Schema, And

# And代表两个条件必须同时满足
Schema(And(str, lambda s: len(s) > 2)).validate('abcd')
# 'abcd'

4. Схема афферентных для контейнера объектов (список, кортеж, набор, и т.д.)

Например:

Schema([int, float]).validate([1, 2, 3, 4.0])
# [1, 2, 3, 4.0]

Это соответствует, [1, 2, 3, 4,0] любого элемента, который должен быть INT или плавать на работу (или отношения между записки)

5. Схема для передачи в словаре объекта (большинство сцен передаются с помощью объекта словаря схемы, это очень важно)

Schema({'name': str, 'age': int}).validate({'name': 'foobar', 'age': 18})
# {'age': 18, 'name': 'foobar'}
Schema({'name': str, 'age': int}).validate({'name': 'foobar'})
# SchemaMissingKeyError: Missing keys: 'age'

Прежде всего, четкие две концепции, схемы словаря входящего класс, называемый режим словаря, valdiate входящий метод, называемый словарь словаря данных.

Во-первых, схема будет определять, является ли точно так же, не то же самое непосредственно выброшен словарь шаблон и ключ словаря данных. Если вы хотите получить словарь данных, чтобы проверить значение соответствующего значения словаря режима, только чтобы вернуть все данные, если значение словаря данных можно проверить через него, в противном случае бросить исключение, не чувствуя это внезапное чувство свежего подтверждения этого?

6. Вопросы и ответы

6.1 Схема словаря Incoming очень удобно, но некоторые из моих данных не является обязательными, что некоторые ключи не могут обеспечить, как это сделать?

from schema import Optional, Schema


Schema({'name': str, Optional('age'): int}).validate({'name': 'foobar'})
# {'name': 'foobar'}
Schema({'name': str, Optional('age', default=18): int}).validate({'name': 'foobar'})
# {'age': 18, 'name': 'foobar'}

6.2 Запрещается ввод ключа: Запрещено

Запретный ключ может быть запрещено:

from schema import Schema, Forbidden

Schema({Forbidden('name'): str, 'age': int}).validate({"age": 15})                            # {"age": 15}
Schema({Forbidden('name'): str, 'age': int}).validate({"name": "laozhang", "age": 15})        # schema.SchemaForbiddenKeyError
Schema({Forbidden('name'): str, 'age': int}).validate({"name": 10, "age": 15})                # schema.SchemaWrongKeyError

Стоит отметить, что, в сочетании с отключенным секретного ключа значение будет определять, будет ли она быть отвергнута:

from schema import Schema, Forbidden

Schema({Forbidden('name'): int, 'name': str}).validate({'name': 'laozhang'})                  # {'name': 'laozhang'}
Schema({Forbidden('name'): str, 'name': str}).validate({'name': 'laozhang'})                  # schema.SchemaForbiddenKeyError

Кроме того, Запретный приоритет выше, чем Дополнительно:

from schema import Schema, Forbidden, Optional

Schema({Forbidden('name'): str, Optional('name'): str}).validate({"name": "laozhang"})        # schema.SchemaForb

Я хочу только 6.3 Схема проверки части входящего словаря данных, вы можете иметь дополнительный ключ, но не Baocuo, как делать?

Schema({'name': str, 'age': int}, ignore_extra_keys=True).validate({'name': 'foobar', 'age': 100, 'sex': 'male'})
# {'age': 100, 'name': 'foobar'}

6.4 Схема информации выброшенного исключения не очень дружелюбно, и я хочу, чтобы настроить сообщения об ошибках, как это сделать?

Схема собственного класс (использование, И, ИЛИ, Regex, схема и т.д.) имеет ошибку параметра, сообщение об ошибке может быть изменено

Schema({'name': str, 'age': Use(int, error='年龄必须是整数')}).validate({'name': 'foobar', 'age': 'abc'})
# SchemaError: 年龄必须是整数

6.5 Использование

Использование во время проверки, он автоматически поможет вам преобразовать его значение

from schema import Schema, Use

print Schema(Use(int)).validate(10)                 # 10-->int类型
print Schema(Use(int)).validate('10')               # 10-->int类型
print Schema(Use(int)).validate('xiaoming')         # schema.SchemaError

6,6 Const

Мы знаем, что во время проверки использования, автоматически поможет вам преобразовать его значение. Const быть оставляя оригинал без:

from schema import Schema, Use, Const

print Schema(Const(Use(int))).validate('10')        # 10-->str类型

7. Более сложный пример:

from schema import Schema, And, Optional, SchemaError, Regex


def name_check(name):
    password_list = ["root", "admin", "888888", "baba", "aaaaaa", "112233"]
    if name in password_list:
        return False
    return True


schema = {
    "id": And(int, lambda x: 100 <= x, error="id必须是整数,大于等于100"),
    "name": And(str, name_check, error="name已经存在"),
    "price": And(float, lambda x: 111 > x > 0, error="price必须是大于0小于111的小数"),
    "data": {
        "password": And(Regex("[a-z0-9A-Z]{8,20}"), error="密码为数字、字母,长度8-20"),
        "email": And(Regex("^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$"), error="email格式错误")
    },
    Optional("info", default="这个key可以不提供,我设置了这一段默认值。"): str,
}

data = {
    "id": 111,
    "name": "jarvis",
    "price": 9.5,
    "data": {
        "password": "222agfwetAAA",
        "email": "[email protected]",
    }
}

try:
    a = Schema(schema).validate(data)
except SchemaError as e:
    print(e)
else:
    print("验证成功!\n{}".format(a))


# 验证成功!
# {'id': 111, 'name': 'jarvis', 'price': 9.5, 'data': {'password': '222agfwetAAA', 'email': '[email protected]'}, 'info': '这个key可以不提供,我设置了这一段默认值。'}

Ссылка статьи: https: //segmentfault.com/a/1190000011777230#articleHeader5

рекомендация

отwww.cnblogs.com/ChangAn223/p/11239537.html
рекомендация