Python 使用一个影响其他配置参数的可自定义参数进行配置
我有一个config.py文件,其中包含路径和其他常量值:Python 使用一个影响其他配置参数的可自定义参数进行配置,python,Python,我有一个config.py文件,其中包含路径和其他常量值: WORKING_PATH = Path(__file__).resolve().parent size = 160 order = 4 experiment_dir = WORKING_PATH / 'data/experiment' ... 现在,这很容易在我的主脚本中导入,只需使用config.experiment\u dir访问值即可 但是我想更新代码并使工作路径可定制,其中输入参数取自cli。 如果我只是覆盖主函数中的工
WORKING_PATH = Path(__file__).resolve().parent
size = 160
order = 4
experiment_dir = WORKING_PATH / 'data/experiment'
...
现在,这很容易在我的主脚本中导入,只需使用config.experiment\u dir
访问值即可
但是我想更新代码并使工作路径
可定制,其中输入参数取自cli。
如果我只是覆盖主函数中的工作路径
变量,那么实验路径
变量已经设置为默认的工作路径
,因此我必须找到更好的解决方案
在保持简单的同时,处理这个问题的最佳和最干净的方法是什么
此外,在我的配置中找到的路径在不同的函数中被多次引用,因此我希望避免将配置作为参数传递到每个地方。我希望它在任何地方都可以访问,并且希望保持与以前相同的语法(config.experience\u dir
),因此我不必更改所有的配置访问
我想我可以把配置变成一个类,把工作路径作为一个可定制的属性,但是我必须在我的主函数中把它变成全局的
,以避免把它作为参数到处传递。我不确定这是一个真正干净的解决方案。或者有没有一种方法可以使用一个静态类,但使用一个可以更改的变量来实现这一点
编辑:我想我可以使用我已有的覆盖解决方案,但将依赖于工作路径的参数包装在各自的函数中,例如:
def experiment_dir():
return WORKING_PATH / 'data/experiment'
不过,我将不得不通过向所有这些引用添加()来调整代码。但这样一来,诸如experiment\u dir
之类的变量就不会在程序开始时设置,而是会在每次引用时检查工作路径。同样,我不确定这有多干净,因为配置的一些参数现在可以通过()作为函数访问,而一些参数将不使用()作为普通变量。全局变量并不意味着要更改,但您可以使用全局变量,我会用一些动态特性将所有需要更改的变量封装在一个类中
import os
SIZE = 160
ORDER = 4
class CFP:
cwd = None
exp_dir = None
exp_rel_path = 'data/experiment'
def __init__(self, path=__file__, **kwargs):
self.update_to(path, **kwargs)
def update_to(self, fname, **kwargs):
for k in kwargs:
self.__dict__[k] = kwargs[k]
if not os.path.isdir(fname):
self.cwd = os.path.abspath(
os.path.dirname(fname))
else:
self.cwd = os.path.abspath(fname)
self.exp_dir = os.path.join(
self.cwd, *self.pharsed_join(self.exp_rel_path)
)
self.__check_all()
def __check_all(self):
for p in self.__dict__:
if 'rel' not in p:
path = self.__dict__[p]
if not os.path.exists(path):
raise FileExistsError(path)
@staticmethod
def pharsed_join(pstr):
if '/' in pstr:
return pstr.split('/')
return [pstr]
from config_vars import *
config = CFP(exp_rel_path='files')
if __name__ == '__main__':
print(config.exp_dir)
config.update_to('./build', exp_rel_path='o-console')
print(config.exp_dir)