1
1
import argparse
2
2
import json
3
+ import yaml
3
4
import logging
4
5
import os
5
6
@@ -106,3 +107,103 @@ def permission(self, key) -> str:
106
107
:return:
107
108
"""
108
109
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 )
0 commit comments