📜  关于值更改输入统一 (1)

📅  最后修改于: 2023-12-03 15:22:33.843000             🧑  作者: Mango

关于值更改输入统一

在程序开发过程中,常常会遇到需要从用户那里获取输入的情况。这些输入可能是用户在图形用户界面上输入的文本,也可能是从文件中读取的数据,还可能是通过网络传输过来的信息。无论输入的方式如何,我们都需要对这些输入进行处理和验证,以确保程序的正确运行和数据的安全性。

针对这个问题,我们可以采用一种统一的方式,即将所有输入的值进行转换和归一化,以便程序更简洁、易于理解和维护。具体来说,我们可以通过下面的方式来实现这个目标:

定义接口

首先,我们需要定义一个输入接口,以确保程序的所有输入值都符合同样的格式和要求。这个接口应包含以下几个组成部分:

  • 输入的名称和描述。
  • 数据类型和取值范围。
  • 策略和规则,如何处理无效值、忽略或覆盖冲突的值等。

下面是一个示例接口的定义:

interface Input:
    name: str
    description: str
    data_type: type
    default_value: object = None
    required: bool = False
    validators: List[callable] = []
实现转换器

通过定义了输入接口,我们接下来就可以实现一个转换器来将所有的输入值进行统一转换和处理。转换器的主要工作是根据接口定义来验证输入数据的格式和值,并将其转换为与程序中使用的数据类型相匹配的值。具体来说,一个转换器应该包含下面几个组成部分:

  • 输入接口和默认值。
  • 操作方法和规则,例如如何处理无效值或冲突等。
  • 转换方法和规则,将输入的值转换为程序中使用的数据类型。

下面是一个示例转换器的实现代码:

class InputConverter:
    def __init__(self, inputs: List[Input]):
        self.inputs = inputs

    def process(self, input_values: Dict[str, Any]) -> Dict[str, Any]:
        """Processes the given input values and returns a dictionary of normalized values."""
        result = {}
        for input in self.inputs:
            name = input.name
            value = input_values.get(name, input.default_value)

            try:
                value = self._validate(name, value, input)
                value = self._convert(name, value, input)
            except ValueError as ve:
                if input.required:
                    raise ve
                
                continue

            result[name] = value

        return result

    def _validate(self, name: str, value: Any, input: Input) -> Any:
        """Validates the given input value and returns the validated value."""
        if input.required and value is None:
            raise ValueError(f"Missing required input: {input.description}")

        if not isinstance(value, input.data_type):
            raise ValueError(f"Invalid input type: {input.description} (expected {input.data_type}, got {type(value)})")

        for validator in input.validators:
            validator(value)

        return value

    def _convert(self, name: str, value: Any, input: Input) -> Any:
        """Converts the given input value to the expected type and returns the converted value."""
        if isinstance(value, input.data_type):
            return value

        if input.data_type == int:
            try:
                return int(value)
            except ValueError as ve:
                raise ValueError(f"Invalid integer input: {input.description}") from ve
        elif input.data_type == float:
            try:
                return float(value)
            except ValueError as ve:
                raise ValueError(f"Invalid floating-point input: {input.description}") from ve
        elif input.data_type == bool:
            return str(value).lower() in ["1", "true", "yes", "on", "enable"]
        elif input.data_type == str:
            return str(value)
        else:
            raise ValueError(f"Unsupported data type: {input.description}")
应用示例

最后,我们来看一个示例,如何应用上面的接口和转换器来处理用户输入数据。在这个示例中,我们需要获取用户在命令行上输入的两个数字,并将这些数字进行相加。

首先,我们需要定义输入接口:

x_input = Input(
    name="x", description="The first number", data_type=int, required=True,
    validators=[lambda x: x > 0]
)
y_input = Input(
    name="y", description="The second number", data_type=int, required=True,
    validators=[lambda y: y > 0]
)

然后,我们创建一个转换器,并将它用于处理命令行输入的值:

import sys
import argparse

parser = argparse.ArgumentParser(description="Add two numbers")
parser.add_argument("--x", type=int, help="The first number")
parser.add_argument("--y", type=int, help="The second number")
args = parser.parse_args()

converter = InputConverter(inputs=[x_input, y_input])
input_values = {"x": args.x, "y": args.y}
normalized_values = converter.process(input_values)

最后,我们将得到标准化后的两个值,并将它们相加:

x = normalized_values['x']
y = normalized_values['y']
result = x + y
print(f"{x} + {y} = {result}")

通过这种方式,我们就能够利用输入接口和转换器,将用户输入数据变得统一和易于处理,进而提高程序的代码质量和可维护性。