Skip to content

Commit 0df1704

Browse files
authored
Merge pull request #105 from katagomo/main
宽容性和可拓展的配置文件访问方式
2 parents 1c98085 + 655f4e6 commit 0df1704

File tree

2 files changed

+103
-1
lines changed

2 files changed

+103
-1
lines changed

mod/args/__init__.py

+101
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import argparse
22
import json
3+
import yaml
34
import logging
45
import os
56

@@ -106,3 +107,103 @@ def permission(self, key) -> str:
106107
:return:
107108
"""
108109
return self.auth.get(key, '')
110+
111+
DEFAULT_DATA = {
112+
"server": {
113+
"ip": "*",
114+
"port": 28883
115+
},
116+
"auth": {}
117+
}
118+
119+
class Args():
120+
def __init__(self, data=None, default=None):
121+
self.__data: dict = data
122+
self.__default: dict = default or {}
123+
124+
def __invert__(self):
125+
return self.__data
126+
127+
def __get(self, key: str) -> 'Args':
128+
# 如果不是字典,则返回Args包装的None
129+
if not isinstance(self.__data, dict):
130+
return Args()
131+
else:
132+
# 如果key不存在,则返回Args包装的None
133+
if key not in self.__data.keys():
134+
return Args()
135+
# 如果key对应的值是字典,则返回Args包装的字典,默认值从__default中获取
136+
if isinstance(self.__data[key], dict):
137+
return Args(data=self.__data[key], default=self.__default.get(key, {}))
138+
# 如果key对应的值不是字典,则返回Args包装的值
139+
return Args(data=self.__data[key])
140+
141+
def __set_default(self, default_data: dict):
142+
self.__default = default_data
143+
144+
def __call__(self):
145+
"""
146+
JSON: config/config.json
147+
YAML: config/config.yaml
148+
149+
default: YAML
150+
"""
151+
for loader in (self.__load_json, self.__load_yaml):
152+
data = loader()
153+
if isinstance(data, dict):
154+
self.__data = data
155+
return
156+
# 如果没有读取到有效数据,则使用默认数据
157+
self.__data = self.__default
158+
# 写入默认数据
159+
directory = os.path.join(os.getcwd(), "config")
160+
if not os.path.exists(directory):
161+
os.makedirs(directory)
162+
file_path = os.path.join(directory, "config.yaml")
163+
with open(file_path, "w+") as yaml_file:
164+
yaml.dump(DEFAULT_DATA, yaml_file)
165+
166+
@staticmethod
167+
def __load_json() -> dict|None:
168+
file_path = os.path.join(os.getcwd(), "config", "config.json")
169+
try:
170+
with open(file_path, "r+") as json_file:
171+
return json.load(json_file)
172+
# 解析错误
173+
except (json.JSONDecodeError, FileNotFoundError):
174+
return None
175+
176+
@staticmethod
177+
def __load_yaml() -> dict|None:
178+
file_path = os.path.join(os.getcwd(), "config", "config.yaml")
179+
try:
180+
with open(file_path, "r+") as yaml_file:
181+
return yaml.safe_load(yaml_file)
182+
except (yaml.YAMLError, FileNotFoundError):
183+
return None
184+
185+
def __getattribute__(self, item):
186+
if item.startswith('_'):
187+
return super().__getattribute__(item)
188+
return self.__get(item)
189+
190+
def __str__(self):
191+
return str({
192+
"data": self.__data,
193+
"default": self.__default
194+
})
195+
196+
if __name__ == '__main__':
197+
default: dict = {
198+
"server": {
199+
"ip": "*",
200+
"port": 28883
201+
},
202+
"auth": {}
203+
}
204+
config = Args(default=default)
205+
config()
206+
print(~config.server)
207+
print(~config.server.port)
208+
print(~config.auth)
209+
print(~config.auth.admin)

requirements.txt

+2-1
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,5 @@ aiohttp~=3.9.1
88
Pillow~=10.1.0
99
pyaes~=1.6.1
1010
Werkzeug~=3.0.1
11-
mygo~=1.0.0
11+
mygo~=1.0.0
12+
PyYAML~=6.0.2

0 commit comments

Comments
 (0)