tketool 1.0.18
Some base methods for developing

## tketool  
这个Python模块主要用于文件和目录的操作，包括创建、读写、遍历等功能，同时还提供了对SFTP服务器上文件的路径获取。另外，它还包含了一些关于配置管理和日志记录的功能，如获取配置文件中的设置、日志的记录和查询等。此外，还提供了对数据进行哈希运算的方法和打印格式化表格的功能。

类成员: 


| name|info | 
| ----|---- | 
| Service_Shelve|`Service_Shelve`是一个配置管理类，主要用于获取配置文件中的设置，并实例化为各种资源对象。 | 
| Custom_Handler|这是一个自定义日志处理器，可以控制日志的输出方式，并维护最近的20条日志记录。 | 
| log_color_enum|这是一个定义日志颜色ANSI代码常量的枚举类，用于设置和重置日志文本颜色。 | 
| ConfigManager|ConfigManager是一个处理配置文件读写的类，支持查询、获取配置项，并在不存在时添加默认值。 | 


函数成员: 


| name|info | 
| ----|---- | 
| create_folder_if_not_exists|这是一个创建指定路径文件夹的函数，如果路径已存在则不会报错，适用于多种操作系统。 | 
| write_file_line|这是一个将行列表写入指定文件的函数，可以选择是否移除每行的换行符。 | 
| read_file_lines|这是一个读取文本文件内容的函数，可以选择是否删除换行符，若读取失败返回空列表。 | 
| write_file|这是一个Python函数，用于将指定内容写入指定路径的文件，如果文件已存在，原内容会被覆盖。 | 
| read_file|这是一个Python函数，用于读取指定路径的文件内容，如果遇到错误则返回空列表。 | 
| enum_directories|这个函数用于遍历指定路径下的所有目录，并可选是否递归遍历子目录。 | 
| enum_files|这是一个可以递归枚举指定目录及其子目录下所有文件的生成器函数。 | 
| delete_files_in_directory|这是一个Python函数，用于递归删除指定目录及其子目录下的所有文件和链接。 | 
| get_file_path_in_sftpserver|这是一个Python函数，用于获取本地或SFTP服务器上文件的路径。 | 
| get_help_info|该函数用于从函数的文档字符串中提取参数的帮助信息。 | 
| hash_str|这是一个将任意对象转化为字符串并进行MD5哈希运算的函数。 | 
| hash_obj_strbase|这是一个Python函数，用于对各种类型的输入对象进行哈希处理并返回处理后的字符串形式。 | 
| set_logger|这个函数主要用于设置和替换目标日志记录器的处理程序。 | 
| log|这是一个使用当前日志处理器记录日志信息的函数，不支持控制台输出彩色日志。 | 
| log_multi_row|这是一个使用全局变量`current_logger`来记录多行日志的函数。 | 
| get_log_history|这是一个无参数的函数，用于获取当前操作句柄的日志历史记录，并返回一个列表。 | 
| convert_print_color|这是一个将输入参数转化为带颜色的字符串的函数，输入可以是字符串或包含字符串和颜色枚举的元组。 | 
| print_table|这个函数用于打印格式良好的表格，通过指定列名和数据行进行表格的构建。 | 
| get_config_instance|这个函数用于获取或创建指定配置文件的配置管理器实例，实现了单例模式。 | 


### create_folder_if_not_exists  
创建一个文件夹，如果该文件夹不存在。这个函数的目标是为了确保当程序需要在某个特定的路径下写入文件或者创建新的文件夹时，这个路径确实存在。这也可以避免在程序试图访问不存在的路径时发生错误。




**参数：**

*args：一个或多个字符串，表示要创建的文件夹的路径。例如，create_folder_if_not_exists('folder1', 'folder2') 将在当前目录下创建一个名为 'folder1/folder2' 的文件夹。




**返回值：**

str：返回创建的文件夹的完整路径。




**使用例子：**

```python

path = create_folder_if_not_exists('folder1', 'folder2')

```




**注意：**

该函数使用了os模块的os.path.join函数来连接路径。这是一个与平台无关的方式，可以在Linux、Windows等不同的操作系统上都能正常工作。同时，该函数也使用了os模块的os.makedirs函数来创建文件夹。其中的exist_ok参数设为True，表示如果路径已经存在，不会抛出错误，而是直接返回路径。

此外，该函数假定程序有相应的文件操作权限。如果没有，os.makedirs可能会抛出PermissionError异常。

### write_file_line  
这个函数的主要目的是将给定的行列表写入到指定的文件中。如果指定了ignor_n_char参数为True，那么在写入文件之前，会将行列表中的每一行中的"\\n"字符进行移除。




**参数:**

path (str): 待写入的文件的路径。

lines (list): 需要写入的行列表，每个元素代表一行。

ignor_n_char (bool): 是否在写入文件之前移除每一行中的"\\n"字符，默认为True。




**返回类型:**

无返回值




**使用示例:**

write_file_line("/tmp/test.txt", ["Hello\\n", "World"], True)




**注意事项:**

在进行文件写入操作时，请确保拥有对应文件的写权限，否则可能会引发权限错误。




**错误或异常:**

如果给定的文件路径不存在，或者没有写权限，函数会抛出异常。

### read_file_lines  
这是一个简单的函数，用于读取文本文件的内容。此函数根据用户的需求，可以选择是否删除行尾的换行符。




**参数:**

path (str): 指定要打开的文件的路径。

replace_n_char (bool): 如果为True，则在返回的行尾会删除换行符。默认为False，即不删除换行符。




**返回:**

List[str]: 返回一个列表，其中包含文件中的所有行。如果文件打开失败，或者在读取文件过程中发生了其他错误，那么返回一个空列表。




**示例:**

lines = read_file_lines("example.txt", replace_n_char=True)

\# 从"example.txt"文件中读取所有行，并删除每一行的行尾换行符。




**错误和异常:**

如果在尝试打开或读取文件的过程中发生了错误，此函数会打印出错误原因，并返回一个空列表。

### write_file  
这个函数是用来将特定的内容写入到指定的文件中。




**Args:**

path(str): 需要写入内容的文件的路径。

content(str): 需要写入的内容。




**Returns:**

None. 这个函数没有返回值，只是执行写入文件的操作。




**Raises:**

Exception: 如果写入文件过程中出现错误，会抛出异常。




**Example:**

```python

write_file('example.txt', '这是一段示例内容。')

```

这个例子中，函数会将'这是一段示例内容。'这段话写入到'example.txt'这个文件中。




**Note:**

这个函数使用 'w' 模式打开文件，所以如果文件已经存在，它的原有内容会被新的内容覆盖。

### read_file  
此函数是用于读取指定路径的文件。




**参数:**

path (str): 文件的路径。




**返回:**

str: 返回读取的文件内容。如果读取过程中有任何错误，会返回一个空列表。




**示例:**




**函数调用可以如下所示:**

read_file('path/to/your/file.txt')




**错误:**

如果文件路径不存在或者文件无法打开，函数会捕获异常并打印错误信息。

### enum_directories  
enum_directories函数将遍历给定路径下的所有目录，并根据参数决定是否递归遍历子目录。




**参数:**

path (str): 需要遍历的目录路径。

recursive (bool, 可选): 是否递归遍历子目录。默认为False，表示只遍历顶层目录。




**返回:**

generator: 一个生成器，每次yield一个元组，包含两个元素，第一个元素是完整的目录路径，第二个元素是目录的名字。




**使用方法:**




**for dir_path, dir_name in enum_directories('/path/to/directory', recursive=True):**

print(f'Found directory: {dir_path} with name: {dir_name}')




**错误或者bug:**

如果输入的路径不存在或者不是一个目录，函数会抛出异常。

### enum_files  
这是一个枚举目录中文件的函数。




**参数:**

path (str): 需要枚举的目录路径。

recursive (bool): 是否需要递归枚举子目录中的文件，如果设为False，则只枚举顶层目录中的文件。




**返回:**

generator: 这是一个生成器函数，每次调用都会返回下一个文件的完整路径和文件名。




**例子:**

\# 枚举当前目录下的所有文件




**for full_path, file_name in enum_files('.'):**

print(full_path, file_name)

\# 枚举当前目录及其子目录下的所有文件




**for full_path, file_name in enum_files('.', True):**

print(full_path, file_name)




**注意:**

该函数依赖于os模块，使用前请确保已经正确导入os模块：import os。

### delete_files_in_directory  
删除给定目录下的所有文件和子目录。

这个函数会遍历给定目录，对于目录下的每一个文件或目录，如果是文件或者链接，直接删除；如果是目录，递归删除该目录及其包含的所有文件和子目录。




**参数：**

directory (str): 需要删除文件的目录路径




**返回：**

None




**错误：**

如果删除文件或目录过程中出现错误，会打印错误信息，但不会中断程序。




**使用示例：**

delete_files_in_directory('/path/to/directory')




**注意：**

调用这个函数需要谨慎，因为它会删除指定目录下的所有文件和子目录，且不可恢复。

### get_file_path_in_sftpserver  
这是一个Python函数，用于在SFTP服务器中获取文件的路径。如果在本地路径中找不到文件，那么函数将会尝试连接SFTP服务器并从中下载文件。




**参数：**

folder_path (str): 本地文件夹路径，用于和文件名拼接成文件的完整本地路径。

filename (str): 需要获取路径的文件的文件名。

endpoint (str): SFTP服务器的IP地址或者主机名。

access_user (str): 登陆SFTP服务器的用户名。

secret_pwd (str): 登陆SFTP服务器的密码。

remote_folder_path (str): 远程SFTP服务器文件夹路径，用于和文件名拼接成文件的完整远程路径。

port (int, optional): SFTP服务器的端口，默认为22。




**返回：**

str: 文件的本地路径。




**示例：**

```python

local_path = get_file_path_in_sftpserver('/local/folder', 'test.txt', 'sftp.server.com', 'user', 'password', '/remote/folder')

print(local_path) \# 输出: '/local/folder/test.txt'

```




**注意：**

- 如果本地文件不存在，且尝试从SFTP服务器下载时发生错误，那么函数会抛出异常。

- 函数使用了`paramiko`库建立SSH连接和SFTP客户端，确保在使用前已安装此库。

- 函数使用了自定义的`log`函数记录日志，请在同一个作用域内定义此函数，否则将会抛出`NameError`异常。

### get_help_info  
Extract parameters help info from function's docstring.

### Service_Shelve  
这个类`Service_Shelve`是一个配置管理类，它主要用于获取指定配置文件中的各种设置，如数据源路径、模型URL、API令牌等。

它通过读取配置文件，将配置内容实例化为config对象，并提供获取各种资源（如数据源、模型等）的方法。




**示例:**

```

service_shelve = Service_Shelve("config_file_path")

datasource = service_shelve.get_datasource()

model = service_shelve.get_llm_GLM6B()

```




**方法列表：**

- `\_\_init\_\_(self, config_file_path)`: 构造函数，接收一个config_file_path，这个路径是配置文件的路径。该函数将配置文件实例化为config对象。

- `get_config(self)`: 返回config对象。

- `get_datasource(self)`: 从配置文件中获取sample_source_path，然后根据路径实例化一个LocalDisk_NLSampleSource对象。

- `get_llm_GLM6B(self, buffer_version=-1)`: 从配置文件中获取glm_url配置，并将其实例化为ChatGLM对象。

- `get_llm_GPT4(self, buffer_version=-1)`: 从配置文件中获取openai_proxy、openai_token、openai_temperature配置，并将相关配置实例化为ChatGPT4对象。

- `get_llm_GPT35(self, buffer_version=-1)`: 从配置文件中获取openai_proxy、openai_token、openai_temperature配置，并将相关配置实例化为ChatGPT3对象。

- `get_ft_model(self, model_id, buffer_version=-1, **kwargs)`: 从配置文件中获取openai_proxy、openai_token、openai_temperature配置，并将相关配置与提供的model_id、**kwargs实例化为FineTuned_Completion_Model对象。

- `get_emb(self, buffer_version=-1, **kwargs)`: 从配置文件中获取openai_token、openai_proxy配置，并将相关配置实例化为Openai_embedding对象。

#### \_\_init\_\_  
初始化Service_Shelve类。

这个类是一个服务存储器，负责管理和提供各种服务。这些服务可能包括数据源、多种语言模型、嵌入模型等。Service_Shelve通过读取一个配置文件来获取这些服务的配置信息，根据这些配置信息初始化相应的服务。




**参数:**

config_file_path (str): 配置文件的路径。这个配置文件中包含了各种服务的配置信息。




**属性:**

config_obj: 根据给定的配置文件路径生成的配置对象。这个配置对象之后会被用来获取各种服务的配置信息。




**示例:**

service_shelve = Service_Shelve("path/to/config/file")

glm6b_service = service_shelve.get_llm_GLM6B()

gpt4_service = service_shelve.get_llm_GPT4()

emb_service = service_shelve.get_emb()

#### get_config  
获取配置对象。

此方法是类Service_Shelve的一个方法，用于获取一个保存了某配置文件信息的对象。该对象可根据需要获取配置文件中的指定信息。




**返回:**

obj: 一个配置文件对象。可以根据需求获取配置文件中的指定信息。




**示例:**

service_shelve = Service_Shelve(config_file_path="config/path")

config_obj = service_shelve.get_config()

#### get_datasource  
该函数用于获取数据源。

获取数据源的具体方式是通过配置文件（由self.config_obj所代表）来获取sample_source_path的值，该值代表数据源在本地磁盘的存储路径。然后，使用LocalDisk_NLSampleSource类来实例化一个数据源对象，该对象的特点是从本地磁盘读取样本来源。

函数没有参数。

返回类型是LocalDisk_NLSampleSource类的一个实例，代表一个可以从本地磁盘读取样本来源的数据源对象。




**使用示例：**

service_shelve = Service_Shelve(config_file_path)

datasource = service_shelve.get_datasource()

注意：如果配置文件中没有sample_source_path的配置项，或者该配置项的值不是一个有效的本地磁盘路径，可能会在运行时抛出异常。

#### get_llm_GLM6B  
此函数的目的是从配置文件获取GLM模型的URL，并返回GLM模型实例。




**参数:**

buffer_version(int, 可选): 版本号，默认为-1。




**返回:**

返回ChatGLM类的实例，这是一个机器学习模型。




**例子:**

service_shelve = Service_Shelve('config_file_path')

glm_model = service_shelve.get_llm_GLM6B()




**注意:**

需要先确保配置文件中存在"glm_url"这个配置项，并且其值是GLM模型的URL。

#### get_llm_GPT4  
这个方法用于获取`ChatGPT4`模型实例。




**参数:**

buffer_version (int, optional): 版本号，默认是-1。




**返回:**

ChatGPT4: 返回带有指定参数的ChatGPT4实例。




**解释:**

该方法从配置对象中获取所需的配置信息（如代理设置、API令牌和温度参数）。然后，它使用这些配置信息创建一个新的ChatGPT4实例，并返回。

在函数内部，首先通过调用`self.config_obj.get_config`方法获取必要的配置，比如"openai_proxy"、"openai_token"和"openai_temperature"。

然后，将获取的temperature转换为float类型，并设置到配置字典config_dict中。

最后，使用获取到的api_token、proxys、config_dict和buffer_version作为参数，创建一个新的ChatGPT4对象，并返回。




**例如：**

```python

service_shelve = Service_Shelve(config_file_path)

gpt4 = service_shelve.get_llm_GPT4(buffer_version=0)

```




**注意:**

如果配置文件中没有设置相关的配置信息，"openai_proxy"和"openai_token"将默认为"not_set"，"openai_temperature"将默认为"0.8"。

#### get_llm_GPT35  
此函数的目的是获取GPT-3.5语言模型的实例。




**参数:**

buffer_version (int, 默认值为-1): 指定的缓存版本，如果没有指定，则默认为-1。




**返回:**

返回的是一个ChatGPT3实例。该实例是使用从配置对象中获取的代理和API令牌创建的，温度参数也从配置对象中获取。




**使用示例：**

service_shelve = Service_Shelve(config_file_path)

gpt3_5_llm = service_shelve.get_llm_GPT35(buffer_version=1)




**注意事项：**

1. 这个函数从配置对象中获取了openai代理、openai令牌和openai温度这些配置。所以，应确保在调用此函数之前已经正确设置了这些配置。

2. 如果在创建ChatGPT3实例时发生错误，此函数不会捕获和处理这些错误，所以你需要自行处理可能出现的异常。

#### get_ft_model  
此函数的主要目的是根据指定的模型ID和其他参数，获取一个经过微调的模型。




**参数：**

model_id (str) : 模型ID。

buffer_version (int, 可选) : 缓冲区版本，默认为 -1。

**kwargs : 其他一些需要传递给模型的参数。




**返回：**

FineTuned_Completion_Model 对象：一个经过微调的模型对象。




**示例：**

>>> service = Service_Shelve(config_file_path)

>>> ft_model = service.get_ft_model('gpt-3.5-turbo')

>>> result = ft_model.predict('Hello, how are you?')




**注意：**

- 在使用这个函数时，需要保证已经配置了openai代理和openai的api token，以及openai的温度参数，否则可能无法正确获取模型。

- 如果传递给此函数的buffer_version参数为负数，则会自动使用默认的buffer_version。

- 如果函数无法获取指定的模型ID，则可能会抛出异常。




**错误：**

- 如果获取的模型不存在或无法访问，将抛出异常。

#### get_emb  
get_emb是Service_Shelve类的一个方法，用于获取嵌入模型。




**参数:**

buffer_version(int, 可选): 缓冲区版本，默认为-1，表示使用最新版本。

**kwargs(dict, 可选): 允许用户提供额外的配置参数。




**返回:**

返回值是一个Openai_embedding实例。此实例可用于获取特定文本的嵌入表示。




**举例:**

```python

service_shelve = Service_Shelve(config_file_path="config.json")

emb_model = service_shelve.get_emb()

text_embedding = emb_model.get_embedding("This is a test sentence")

```




**注意:**

为了使用此函数，需要在配置文件中提供有效的OpenAI API令牌和代理服务器详细信息(如果使用)。如果这些信息未正确配置，函数可能会引发异常。




**错误与异常:**

如果给定的buffer_version无效，或者OpenAI API令牌或代理服务器详细信息未正确配置，此函数可能会引发异常。

### hash_str  
这是一个将字符串哈希化的函数。




**Args:**

target_str (str): 对这个字符串进行哈希化操作。




**Returns:**

str: 返回一个经过MD5哈希运算后的字符串。

注意:如果传入的不是字符串类型,会先将其转化为字符串类型然后进行哈希运算。




**示例:**

```python

print(hash_str('hello world')) \# 输出: 5eb63bbbe01eeed093cb22bb8f5acdc3

```

函数并不会检查传入参数的有效性, 如果传入对象不能被转化为字符串, 则会抛出一个ValueError异常。

### hash_obj_strbase  
该函数的主要功能是对输入的对象进行哈希处理，转换成字符串的形式。它能够对不同类型的对象进行处理，包括字符串、整数、浮点数、字典以及可迭代的对象。




**参数:**

obj: 待处理的对象，可以是任何类型




**返回:**

对输入对象进行哈希处理后的字符串




**处理过程:**

1. 如果输入的对象是字符串、整数、浮点数，则直接转换为字符串并进行哈希处理

2. 如果输入的对象是字典，则将字典的键和值分别转换为列表，然后进行哈希处理，最后将处理后的键和值的哈希结果进行连接并进行哈希处理

3. 如果输入的对象是可迭代的对象，则将每个元素转换为字符串并进行哈希处理，然后将所有元素的哈希结果连接成一个字符串并进行哈希处理

4. 如果输入的对象是其他类型，则将对象的类名转换为字符串并进行哈希处理




**注意事项:**

这个函数没有处理递归引用的情况，例如，列表或字典等数据结构中包含自身的引用，这会导致无限递归。如果输入的对象中存在这种情况，函数可能会出现堆栈溢出的错误。




**示例:**

print(hash_obj_strbase("hello"))  \# 输出一个字符串的哈希值

print(hash_obj_strbase({"name": "Tom", "age": 20}))  \# 输出一个字典的哈希值

print(hash_obj_strbase([1, 2, 3]))  \# 输出一个列表的哈希值

print(hash_obj_strbase((1, 2, 3)))  \# 输出一个元组的哈希值

### Custom_Handler  
这个类是一个自定义的日志处理器，它继承自`logging.Handler`。

这个处理器的主要功能是：将日志信息输出到标准输出，并且提供了一些特殊的处理，比如处理进度条显示和历史记录。




**这个处理器的工作原理如下：**

- 当日志等级为62时，表示这是一个进度条结束的信号，它会将进度条的标志位设置为`False`，并输出‘process finish.’信息。

- 当日志等级为60时，表示这是一个进度条开始的信号，它会将进度条的标志位设置为`True`，并在标准输出上显示进度条。

- 当日志等级为61时，表示这是一个普通的日志信息，但是需要在进度条下方打印，所以它会先输出一个回车符`\\r`，然后输出日志信息，最后再输出进度条。

- 对于其他日志等级，也会根据进度条的标志位来决定是在进度条下方打印，还是直接打印。

这个处理器还维护了一个最近输出的20条日志的历史记录队列。




**这个类的使用方法如下：**

```python

import logging

handler = Custom_Handler()

logger = logging.getLogger(\_\_name\_\_)

logger.addHandler(handler)

\# 输出普通日志

logger.log(61, "This is a normal log.")

\# 开始进度条

logger.log(60, "Start progress bar...")

\# 结束进度条

logger.log(62, "End progress bar.")

```

#### \_\_init\_\_  
Custom_Handler类的初始化函数。

该类是用于特殊的日志处理，包括处理进度条显示以及历史记录的保存等功能。在初始化的时候，会设定一些默认的参数。




**Attributes:**

in_processbar (bool): 一个标志位，用于判断当前是否在处理进度条显示。

history (deque): 一个双端队列，用于保存最近的20条历史记录。

processbar_str_temp (str): 一个临时字符串，用于保存当前的进度条显示。




**示例:**

handler = Custom_Handler()

logger = logging.getLogger('your_logger')

logger.addHandler(handler)




**注意:**

此类特定于处理带有进度条的日志。对于普通的日志，可能不适用。

#### emit  
这是 Custom_Handler 类中的一个方法，用于将记录的日志信息输出至标准输出。此方法根据记录的日志级别进行不同的处理。




**参数:**

record: logging.LogRecord 对象，包含了所有要输出的日志信息。

返回类型: 无返回值。




**函数流程：**

1. 如果日志级别为62，表明进度条已完成，它将向标准输出写入'\\r'和'process finish.'，然后返回。

2. 如果日志级别为60，表明进度条正在进行中，它将替换消息中的换行符，然后将消息写入到标准输出，如果此时不在进度条中，它还会在消息前增加一个换行符。

3. 如果日志级别为其他值，它会根据是否在进度条中进行不同处理。如果在进度条中，它将在消息前后各增加一个换行符并将消息和进度条一起写入到标准输出。如果不在进度条中，它将在消息前增加一个换行符，然后将消息写入到标准输出。




**特殊处理：**

如果日志级别为61，它将不会替换消息中的换行符。




**注意：**

无论何时，都会刷新标准输出，并将消息添加到历史队列中。

错误或者bug: 无特殊说明。

### set_logger  
这个函数用于设置日志记录器的处理程序。




**参数列表:**

target_logger (logging.Logger): 需要设置处理程序的目标日志记录器




**返回类型:**

无

此函数将遍历目标日志记录器中的所有处理程序，并将它们从记录器中移除。

然后，它将当前的处理程序添加到目标日志记录器中。

注意，此函数假定在调用此函数之前，已经创建并配置了名为current_handle的处理程序。




**示例:**

import logging

logger = logging.getLogger(\_\_name\_\_)

handler = logging.StreamHandler()

set_logger(logger, handler)

这段代码创建了一个名为\_\_name\_\_的日志记录器，并将默认流处理程序设置为处理程序。

然后，它使用set_logger函数将处理程序设置为当前处理程序。

注意: 此函数存在一个潜在的问题，那就是它会移除目标日志记录器中的所有处理程序，而不仅仅是要替换的那一个。

如果记录器在其他地方也在使用，这可能会导致问题。在使用此函数之前，最好确认目标记录器的处理程序是否真的需要被完全替换。

### log  
这是一个简单的日志记录函数。此函数首先通过全局变量current_logger获取当前的日志处理器，然后调用其info方法记录日志。此函数没有返回值。




**参数:**

str: 需要被记录的日志信息，类型为字符串。




**示例:**

log("This is a test log.")  \# 输出: This is a test log.




**注意:**

尽管在函数体中存在一个被注释掉的print语句，但请不要取消注释并使用，因为它可能会在不支持ANSI escape code的环境中造成问题。该语句设计为在控制台输出彩色日志，\\033[0m为ANSI escape code，用于重置颜色。




**错误和bug:**

暂时没有发现错误和bug。

### log_multi_row  
这是一个记录多行日志的函数。

函数的工作原理是使用全局变量 `current_logger`，并调用其 `log` 方法，实现多行日志的记录。




**参数:**

str (str): 需要记录的多行日志的字符串。




**返回类型:**

无。




**使用示例:**

>>> log_multi_row("这是一个\\n多行日志")




**注意事项:**

1. 本函数没有返回值，其功能仅仅是记录日志。

2. 在使用本函数前，需要确保全局变量 `current_logger` 已经被正确初始化并可以使用。

3. 由于 `log` 方法的第一个参数是 `61`，因此本函数可能仅适用于某些特定配置的日志系统。

### get_log_history  
这是一个函数，获取当前句柄的日志历史记录。

函数没有参数。

返回类型是列表，其中包含当前句柄的历史记录。




**示例：**

```python

log_history = get_log_history()

```

注意：此函数使用了全局变量current_handle，确保在调用此函数前已正确初始化此全局变量。

没有已知错误或bug。

### log_color_enum  
这是一个枚举类log_color_enum，其目的是定义一系列关于日志颜色的常量。这些常量与ANSI颜色代码相对应。




**枚举值包括:**

- DEFAULT: 默认颜色，无特殊颜色代码。

- RED: 红色代码。

- YELLOW: 黄色代码。

- GREEN: 绿色代码。

- BLUE: 蓝色代码。

- MAGENTA: 洋红色代码。

- CYAN: 青色代码。

每个枚举值都是由ANSI颜色代码字符串表示。例如，对于红色，其ANSI颜色代码是"\\033[91m"。




**使用示例:**

```python

print(f"{log_color_enum.RED.value}This is red text{log_color_enum.DEFAULT.value}")

```

在上述示例中，我们使用log_color_enum.RED.value获取红色的ANSI代码，然后将其添加到需要显示为红色的文本前面。然后，我们添加DEFAULT的ANSI代码，以重置颜色到默认状态。这样，任何在这之后打印的文本都将以默认颜色显示，而不是红色。

注意，在某些环境（如Windows的某些版本）中，ANSI颜色代码可能无法正常工作。可能需要使用第三方库（如colorama）来启用ANSI颜色支持。

没有已知的错误或bug。

### convert_print_color  
此函数接收多个参数（可能是字符串或者元组），并根据参数类型进行处理。如果参数是元组，且元组长度为2，元组的第二个元素是颜色枚举类型，那么该元组被认为是包含字符串和颜色枚举的元组，函数会将其转化为带有颜色的字符串；如果参数不符合前述条件，那么直接认为该参数是字符串，进行处理。




**Args:**

*args: 可变参数。每个参数可能是一个字符串，或者一个包含字符串和颜色枚举的元组。




**Returns:**

str: 返回由输入参数转化而来的字符串，如果参数是包含字符串和颜色枚举的元组，转化后的字符串将带有颜色。




**Example:**

convert_print_color('hello', ('world', log_color_enum.RED))

\# 输出：'hello\\033[31mworld\\033[0m'




**Note:**

需要注意，对于元组参数，其第二个元素必须是颜色枚举类型，否则函数会抛出异常。

### print_table  
这个函数的主要作用是打印一个格式良好的表格，表格的列名由参数 `table_col` 提供，表格的数据由参数 `rows` 提供。




**参数:**

table_col (list[str]): 表格列的名字，这是一个字符串列表。

rows (list[list[str]]): 表格的数据，这是一个二维字符串列表，每个子列表代表一行数据。

truncate_string (int, optional): 如果某个单元格的字符串长度超过这个值，则会被截断。默认值为30。




**返回值:**

无。这个函数没有返回值，它的主要目标是提供一个优雅的表格输出。




**例子:**

```python

cols = ["姓名", "年龄", "职业"]

data = [

["张三", "27", "工程师"],

["李四", "31", "医生"],

["王五", "25", "教师"]

]

print_table(cols, data)

```




**注意事项：**

1. 当表格数据的行数和 `table_col` 的长度不一致时，将会引发 `Exception`。

2. `truncate_string` 参数不能为负值，否则会引发 `Exception`。

### ConfigManager  
这是一个ConfigManager类，其目的是用来处理配置文件的读取和写入。它将读取指定的配置文件，并将其内容存储为字典格式以供查询。如果尝试获取不存在的配置项，它会使用默认值，并在配置文件中添加这个键值对。




**以下是一个使用示例:**

```python

cm = ConfigManager("/path/to/config")

value = cm.get_config("key", "default")

```




**类方法介绍:**

- `\_\_init\_\_`: 初始化方法，接收一个配置文件路径参数。在创建类实例时，会立即加载配置文件。

- `_load_configs`: 私有方法，负责加载配置文件。如果文件存在，就读取所有行并将其转换为字典格式。如果文件不存在，就创建一个新的空文件。

- `_sanitize_string`: 静态方法，接收一个字符串，去掉其开头和结尾的双引号或单引号，然后返回。

- `get_config`: 公有方法，接收一个键和一个默认值参数。如果键存在于配置文件中，则返回对应的值；如果不存在，则返回默认值，并将这个键值对添加到配置文件中。

注意：如果配置文件的写入权限被禁止，这个类可能会抛出异常。

#### \_\_init\_\_  
ConfigManager是一个用于配置管理的类。

创建对象时，用户需要提供配置文件的路径作为参数。在创建对象后，该类会自动加载指定路径下的配置文件，以便后续通过键值对的方式获取配置信息。

如果在获取配置信息时，指定的键不存在，该类会自动在配置文件末尾添加该键，并设置其值为默认值。




**示例：**

```python

config_manager = ConfigManager("/path/to/config/file")

db_host = config_manager.get_config("db_host", "localhost")

```




**参数:**

config_file_path: 配置文件的路径。可以是相对路径或绝对路径。如果指定的路径不存在，会自动创建一个新的空白配置文件。




**注意：**

1. 配置文件中的键和值都是字符串形式，键值对之间通过等号("=")分隔，例如：`db_host=localhost`

2. 此类没有提供修改配置信息的方法，如果需要修改配置信息，需要直接修改配置文件，然后重新创建ConfigManager对象以加载新的配置信息。

#### _load_configs  
`_load_configs`是一个私有方法，用于加载配置文件中的配置。如果配置文件存在，它会读取文件中的每一行，并通过等号('=')将每一行分割为key和value，并将它们加入到`_config_map`字典中。同时，为了确保配置项的值是干净的，我们使用`_sanitize_string`方法去除两边可能存在的引号。

如果配置文件不存在，此方法会创建一个新的空的配置文件。

注意，此方法没有返回值。

执行这个方法不需要任何参数。

这个方法在初始化`ConfigManager`类的时候会被自动调用，用于加载配置文件的内容，无需手动调用。

#### _sanitize_string  
_sanitize_string是一个静态方法，用于处理输入的字符串，去除字符串两边的双引号和单引号。




**参数:**

s (str): 待处理的字符串。




**返回:**

str: 返回处理后的字符串。




**例如：**

输入字符串为' "example" ',调用此方法后，返回的字符串为'example'。




**注意：**

该方法仅处理字符串前后的引号，不处理字符串中间的引号。

#### get_config  
此函数是用于获取指定键的配置值。如果键存在于配置映射中，则直接返回其对应的值；否则，会给出警告并在配置文件中添加键和默认值，并返回默认值。




**参数:**

key (str): 需要获取的配置的键。

default_value (str, 可选): 如果键不存在于配置映射中，将使用此默认值。默认值为""。




**返回:**

str: 返回的配置值，如果键不存在于配置映射中，返回的是默认值。




**注意:**

如果键不存在，此函数将自动在配置文件中创建该键，并设置其值为默认值，然后返回默认值。

### get_config_instance  
这个函数的目标是得到一个配置管理器实例。

如果文件名参数为空，函数将获取当前工作目录下名为'config.jconfig'的文件。

如果该文件名还未在_config_instance全局变量中，函数将创建一个新的配置管理器实例，

并将其在_config_instance中与该文件名关联起来。

这个函数使用了全局变量_config_instance来存储所有已创建的配置管理器实例，

并以文件名作为每个实例的键。这种设计模式被称为单例模式，通过它，可以确保对于同一个配置文件，

总是返回同一个配置管理器实例。




**参数:**

filename: str, optional, default=None

配置文件的名字。如果没有指定，将使用当前工作目录中名为'config.jconfig'的文件。




**返回:**

ConfigManager实例。根据提供的文件名，返回对应的配置管理器实例。如果该文件名还未在

_config_instance中，则创建一个新的实例并返回。




**错误:**

如果指定的文件不存在，ConfigManager的构造函数将抛出异常。




**示例:**

\# 获取默认配置文件的配置管理器实例

config_instance = get_config_instance()

\# 获取指定配置文件的配置管理器实例

config_instance = get_config_instance('my_config.jconfig')




**注意:**

此函数依赖于_config_instance全局变量和ConfigManager类，需要确保在使用此函数之前，

这些全局变量和类已经被正确地定义和初始化。

## pyml  
这个Python模块主要用于基于PyTorch的深度学习模型训练，提供了一套完整的训练、验证及优化工具。它包括模型训练类、优化类和状态跟踪类等组件，有利于实现模型的训练、优化和状态追踪。模块还使用了枚举类型来定义设备使用方式、数据类型和模型参数更新模式，提高代码的可读性和维护性。此外，模块还提供了插件调用和训练行为的定义工具，用于定制和扩展模型训练的行为。

类成员: 


| name|info | 
| ----|---- | 
| pymodel_trainer|'pymodel_trainer'是一个基于PyTorch的模型训练类，负责模型的训练、验证和插件调用。 | 
| pytrainer_deepspeed|'pytrainer_deepspeed'是一个类，用于使用DeepSpeed优化库训练并优化PyTorch模型。 | 
| plugin_invoke_Enum|`plugin_invoke_Enum`是一个表示插件调用状态的枚举类，涵盖了从插件执行开始到结束的各个阶段。 | 
| device_use_enum|这是一个名为device_use_enum的枚举类型类，主要用于定义设备使用方式，如自动或CPU。 | 
| dtype_enum|`dtype_enum`是一个枚举类，用于标记和识别不同的数据类型，方便代码中的引用和比较。 | 
| update_mode_enum|这是一个枚举类update_mode_enum，用于定义不同的模型参数更新模式，提高代码的可读性和维护性。 | 
| global_state_board|`global_state_board`是一个在训练过程中进行全局状态记录和管理的类。 | 
| epoch_state_board|`epoch_state_board`是一个类，用于追踪和记录神经网络每个训练周期的状态信息。 | 
| step_state_board|`step_state_board`是一个用于跟踪和记录训练过程中每一步的状态和相关信息的类。 | 
| trainer_plugin_base|这是一个抽象基类，提供训练插件的基础结构和工具，定义了训练插件的基本行为，并且需要子类实现特定训练行为。 | 
| pytrainer_accelerate|'pytrainer_accelerate'类用于在PyTorch和Accelerator库的帮助下，在指定的CPU或GPU上训练模型。 | 


函数成员: 


| name|info | 
| ----|---- | 
| convert_to_list|这是一个将整数、浮点数、列表或Tensor转换为列表的函数，能处理1D或2D的Tensor。 | 
| invoke_at|这是一个装饰器生成器，用于给函数添加识别标签，以便在特定类型的插件调用时触发。 | 


### pymodel_trainer  
`pymodel_trainer`类是一个基于PyTorch的模型训练器，继承自`trainer_plugin_base`。该类主要负责模型的训练、验证以及训练进程的插件调用。




**主要成员函数:**

- \_\_init\_\_: 初始化函数，构造模型训练器

- train: 训练模型

- evaluate: 对模型进行评价

- invoke_model: 调用模型进行预测

- calculate_loss: 计算损失

- zero_grad: 重置梯度

- step: 执行一步优化

- backward: 执行反向传播

初始化函数\_\_init\_\_的参数列表如下

- model: 需要训练的PyTorch模型

- loss_obj: 用于计算模型损失的损失函数

- update_mode: 模型参数更新的模式，每一步更新或者每一轮更新

- output_folder: 模型输出文件夹的路径

- plugins: 训练插件列表

- optimizer_type: 优化器的类型，默认为"adamw"

- lear