1. 提交代码,初始化项目;

This commit is contained in:
2025-12-30 22:42:24 +08:00
parent c61b80f502
commit fad2bbae67
8 changed files with 215 additions and 0 deletions

0
tools/__init__.py Normal file
View File

53
tools/config.py Normal file
View File

@@ -0,0 +1,53 @@
import argparse
import os
import json
from abc import ABC, abstractmethod
from tools.easydict import EasyDict
class AbstractConfig(ABC):
@staticmethod
@abstractmethod
def to_dict(parser_args, conf_path_list=None):
pass
@staticmethod
@abstractmethod
def from_dict(dict_):
pass
class Config(AbstractConfig):
@staticmethod
def to_dict(parser_args, conf_path_list=None):
args = None
if conf_path_list is None or len(parser_args) == 0:
args = EasyDict(parser_args.__dict__)
else:
args = EasyDict()
for json_file_path in conf_path_list:
if not os.path.exists(json_file_path):
raise FileNotFoundError(json_file_path)
with open(json_file_path, 'r', encoding='utf-8') as file:
json_dict = json.load(file)
args.update(dict=json_dict)
return args
@staticmethod
def from_dict(dict_):
return EasyDict(dict_)
if __name__ == '__main__':
# 命令行参数传递
parser = argparse.ArgumentParser(description='Python App Runner')
parser.add_argument('-filename', type=str, default="", help='文件名称')
parser.add_argument('-upload', '--upload', action='store_true', help='是否上传模型')
parser.add_argument('-save', '--save', action='store_true', help='是否保存模型')
parser.add_argument('-online', '--online', action='store_true', help='是否生产环境')
parse_args = parser.parse_args()
# 配置文件参数传递
config = Config("/Users/shawn/Code/python_algo_template/confs/template.json", parser=parse_args)
print(config.to_dict)

65
tools/easydict.py Normal file
View File

@@ -0,0 +1,65 @@
class EasyDict(dict):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self._convert_nested()
def _convert_nested(self):
for key, value in self.items():
if isinstance(value, dict):
self[key] = EasyDict(value)
elif isinstance(value, list):
self[key] = [EasyDict(item) if isinstance(item, dict) else item for item in value]
def __getattr__(self, key):
try:
return self[key]
except KeyError:
raise AttributeError(f"'EasyDict' object has no attribute '{key}'")
def update(self, **kwargs):
assert kwargs is not None and kwargs.get("dict", None) is not None
for key, value in kwargs["dict"].items():
cur_value = self.get(key, None)
if isinstance(cur_value, dict) and isinstance(value, dict):
self[key].update(dict = value)
continue
if isinstance(cur_value, list) and isinstance(value, list):
self[key].extend([EasyDict(item) if isinstance(item, dict) else item for item in value])
continue
if isinstance(value, dict):
self[key] = EasyDict(value)
continue
if isinstance(value, list):
self[key] = [EasyDict(item) if isinstance(item, dict) else item for item in value]
continue
self[key] = value
def to_dict(self):
result = {}
for key, value in self.__dict__.items():
if isinstance(value, EasyDict):
result[key] = value.to_dict()
elif isinstance(value, list):
result[key] = [
item.to_dict() if isinstance(item, EasyDict) else item
for item in value
]
else:
result[key] = value
return result
def test_easy_dict():
easy_dict = EasyDict({"c": 2, "2": 3})
easy_dict.update(dict = {"c": 4, "2": {"d": 5}})
print(easy_dict)
if __name__ == '__main__':
test_easy_dict()