Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用一个影响其他配置参数的可自定义参数进行配置_Python - Fatal编程技术网

Python 使用一个影响其他配置参数的可自定义参数进行配置

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。 如果我只是覆盖主函数中的工

我有一个config.py文件,其中包含路径和其他常量值:

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)