上下文:我正在创建一个 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 的
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 包文档