首页 > 解决方案 > 在 python 中验证数据的最佳方法是什么?

问题描述

我是 Python 的新手,我正在努力寻找验证数据的最佳方法。

我有一个“well”类型的对象,它具有其他对象的属性。数据可以来自 XML 文件或通过代码。一个例子可以在下面看到。


class Well:
    def __init__ (self, name, group):
        self.__name   = name     # Required
        self.__group  = group    # Required
        self.__operate_list = [] # Optional
        self.__monitor_list = [] # Optional
        self.__geometry = None   # Optional
        self.__perf = None       # Optional
        ...

class Operate:

    # *OPERATE (*MAX|*MIN) type value (action)
    # *OPERATE (*PENALTY) type (mode) value (action)
    # *OPERATE (*WCUTBACK) type mode v1 (v2 (v3)) (action)

    def __init__ (self, att:str, type_:str, value: [], mode=None, action=None):
        self.__att = att
        self.__type_ = type_
        self.__mode = mode
        self.__value_list = value
        self.__action = action        

例如,要验证“操作”,我需要检查每个属性的许多限制和有效值。例如,我有一个有效的“type_”字符串列表,我应该断言 type_ 在这个列表中。

1)最好的方法是在构造函数中?我应该创建一种方法来进行此验证吗?或者我应该创建一个仅用于验证数据的新类吗?

2) 我应该在哪里创建这些有效值列表?在构造函数中?作为全局变量?

标签: pythonvalidation

解决方案


您可以通过使用以下property函数来使用 getter 和 setter 方法:

class Operate:
    def __init__(self, type):
        self.type = type

    @property
    def type(self):
        return self._type

    @type.setter
    def type(self, value):
        assert value in ('abc', 'xyz')
        self._type = value

以便:

o = Operate(type='123')

会导致:

Traceback (most recent call last):
  File "test.py", line 18, in <module>
    o = Operate(type='123')
  File "test.py", line 8, in __init__
    self.type = type
  File "test.py", line 15, in type
    assert value in ('abc', 'xyz')
AssertionError

推荐阅读