Python 模块上的用户可编辑配置以及验证

问题描述 投票:0回答:1

上下文:我正在创建一个 python 模块来处理包含 ANSI 转义的字符串,并且有一个函数使用这些“标签”在字符串上插入 ANSI 代码

>>> from colortag import csprint
>>> csprint("Hello, <world: blue; bold>")
Hello, \x1b[34;1mworld\x1b[0m

并且我想让标签中使用的字符(“;”,“<", ">”等)可定制,明显的方法是将它们作为参数传递,但是每次使用时都需要传递参数功能。

所以我想要某种方式来存储这些配置,这样你就需要在一开始就改变一些东西

>>> from colortag import cstring, config
>>> config.attributes_sep = ","
>>> config.attributes_case_sentivie = False
>>> csprint("Hello <world: BLUE, BOLD>")
Hello, \x1b[34;1mworld\x1b[0m

此外,还需要对传递的类型进行验证。

我尝试的是:

class Config:
    def __init__(self):
        self._attributes_sep = ","
        self._attributes_case_sentivie = True
        # etc.
    
    @property
    def attributes_sep(self):
        return self._attributes_sep
    
    @attributes_sep.setter
    def attributes_sep(self, value):
        if not isinstance(value, str):
            raise TypeError("attributes_sep must be str")
        self._attributes_case_sentivie = value
    
    @property
    def attributes_case_sensitive(self):
        return self._attributes_case_sentivie
    
    @attributes_case_sensitive.setter
    def attributes_case_sensitive(self, value):
        if not isinstance(value, bool):
            raise TypeError("attributes_case_sensitive must be bool")
        self._attributes_case_sentivie = value
    
    # etc.

config = Config()

但这样做的问题是,每次添加新配置时,都需要将其添加到

__init__
并创建一个setter和一个getter,看起来非常重复。有其他方法吗?

python design-patterns configuration
1个回答
0
投票

出于您的目的,我认为您将受益于使用 Python 的

dataclasses
来简化配置类的创建,从而减少编写显式 getter 和 setter 的需要。以下是如何使用
Config
实现
dataclasses
类:

from dataclasses import dataclass

@dataclass
class Config:
    attributes_sep: str = ","
    attributes_case_sensitive: bool = True
    # Add more configuration options here

config = Config()

# Access and modify configuration options
print(config.attributes_sep)  # Get the current value
config.attributes_sep = ";"   # Set a new value
print(config.attributes_sep)  # Verify the updated value

使用这种方法,您可以将配置选项定义为

Config
类中的类属性,并且
@dataclass
装饰器会自动为您生成 getter 和 setter 方法。您可以轻松访问和修改配置选项,如上例所示。添加新的配置选项就像向类添加更多属性一样简单。

要了解有关数据类的更多信息,请查看官方内置 Python 包文档

© www.soinside.com 2019 - 2024. All rights reserved.