json 通过范围传递配置的最佳方式

5ssjco0h  于 2023-11-20  发布在  其他
关注(0)|答案(1)|浏览(130)

我有一个绘图功能,我使用多种东西。我绘制曲线的方式是相同的,但我需要根据我绘制的数据自定义限制和标签。现在我在字典中定义设置,然后阅读它们,如

for d in data_keys:
    data = np.load(...) 
    ax.plot(data, label=data_to_label[d])
    ax.xaxis.set_ticks(data_to_xticks[d])
    ax.set_xlim([0, data_to_xlim[d]])

字符串
等等,我需要的其他东西。
字典就像这些

data_to_label = {
    'easy' : 'Alg. 1 (Debug)',
    'hard' : 'Alg. 2',
}

data_to_xlim = {
    'easy' : 500,
    'hard' : 2000,
}

data_to_xticks = {
    'easy' : [0, 250, 500],
    'hard' : np.arange(0, 2001, 500),
}

data_to_ylim = {
    'easy' : [-0.1, 1.05],
    'hard' : [-0.1, 1.05],
}

data_to_yticks = {
    'Easy' : [0, 0.5, 1.],
    'hard' : [0, 0.5, 1.],
}


我有很多这样的,我正在寻找最好的方法来保存它们在配置文件中,并加载到我的绘图功能。我想过Hydra,YAML,JSON,但没有一个允许指定np.arange()作为参数。理想情况下,当我调用python myplot.py时,我可以将配置文件作为参数传递。
我也可以导入它们,但是导入必须从传递给myplot.py的字符串中读取。

bnl4lu3b

bnl4lu3b1#

我也可以导入它们,但是导入必须从传递给myplot.py的字符串中读取
如果你信任导入的模块,这可能是一个好主意。你可以用argparseimportlibinspect模块来做到这一点:
myplot.py

import argparse
import importlib
import inspect

def myplot_function():
    # do stuff here
    print(data_to_label)
    print(data_to_xlim)
    print(data_to_xticks)
    print(data_to_ylim)
    print(data_to_yticks)

if __name__ == '__main__':
    # simple cli
    parser = argparse.ArgumentParser(prog='myplot')
    parser.add_argument('-c', '--config')
    args = parser.parse_args()

    # inject dictionaries into the global namespace
    cfgmod = importlib.import_module(inspect.getmodulename(args.config))
    dicts = {k: v for k, v in inspect.getmembers(cfgmod)
             if isinstance(v, dict) and not k.startswith('_')}
    globals().update(**dicts)

    myplot_function()

字符串
使用方法:

[...]$ python myplot.py -c config.py  # -c whatever/the/path/to/config.py
{'easy': 'Alg. 1 (Debug)', 'hard': 'Alg. 2'}
{'easy': 500, 'hard': 2000}
{'easy': [0, 250, 500], 'hard': array([   0,  500, 1000, 1500, 2000])}  # <- HERE
{'easy': [-0.1, 1.05], 'hard': [-0.1, 1.05]}
{'easy': [0, 0.5, 1.0], 'hard': [0, 0.5, 1.0]}


config.py

import numpy as np

data_to_label = {
    'easy' : 'Alg. 1 (Debug)',
    'hard' : 'Alg. 2',
}

data_to_xlim = {
    'easy' : 500,
    'hard' : 2000,
}

data_to_xticks = {
    'easy' : [0, 250, 500],
    'hard' : np.arange(0, 2001, 500),
}

data_to_ylim = {
    'easy' : [-0.1, 1.05],
    'hard' : [-0.1, 1.05],
}

data_to_yticks = {
    'easy' : [0, 0.5, 1.],
    'hard' : [0, 0.5, 1.],
}

相关问题