【发布时间】:2016-09-16 18:55:54
【问题描述】:
我正在编写一个包,用于导入音频文件、处理它们、绘制它们等,用于研究目的。 在管道的每个阶段,设置都是从设置模块中提取的,如下所示。
我希望能够更新像 MODEL_NAME 这样的全局设置,并在包含它的任何字典中更新它。
settings.py
>MODEL_NAME = 'Test1'
DAT_DIR = 'dir1/dir2/'
PROCESSING = {
"key1":{
"subkey2":0,
"subkey3":1
},
"key2":{
"subkey3":MODEL_NAME
}
}
运行.py
>import settings as s
wavs = import_wavs(s.DAT_DIR)
proc_wavs = proc_wavs(wavs,s.PROCESSING)
我想包含MODEL_NAME 的一些设置字典,效果很好。当我想在运行时更改 MODEL_NAME 时,就会出现问题。所以如果我这样做:
import settings as s
wavs = import_wavs(s.DAT_DIR)
s.MODEL_NAME='test1'
proc_wavs1 = proc_wavs(wavs,s.PROCESSING)
s.MODEL_NAME='test2'
proc_wavs2 = proc_wavs(wavs,s.PROCESSING)
但显然这两个调用s.PROCESSING 将包含最初在设置文件中分配的MODEL_NAME。
更新它的最佳方式是什么?
我想到的可能解决方案:
-
将变量存储为可变类型,然后对其进行更新,例如:
s.MODEL_NAME[0] = ["test1"] # do processing things s.MODEL_NAME[0] = ["test2"] -
将每个设置类别定义为一个函数,以便重新运行 每次调用例如:
MODEL_NAME = 'test1' .. def PROCESSING(): return { "key1":{ "subkey2":0, "subkey3":1 }, "key2":{ "subkey3":MODEL_NAME } }然后
s.MODEL_NAME='test1' proc_wavs1 = proc_wavs(wavs,s.PROCESSING()) s.MODEL_NAME='test2' proc_wavs1 = proc_wavs(wavs,s.PROCESSING())我认为这会很好,但是很难做到 在运行时更改函数的任何条目,例如,如果我想 更新 subkey2 的值并运行其他东西。
其他想法可能是一个带有更新方法的类或其他东西,有没有人有更好的想法?
【问题讨论】:
-
为什么不将模型名称作为参数传递给函数
proc_wavs?如果您想要覆盖其常量,那么编写设置文件也是没有意义的。最好使用 2 个不同的设置文件。 “将变量存储为可变类型”:Python 中的字符串是可变的。 -
1) 你的变量命名不当 2) 不要滥用大写字母 3) 你需要类
-
@Flint 在这种情况下,大写字母的约定是什么?
-
“常量通常在模块级别定义,并以全部大写字母书写,并用下划线分隔单词。示例包括 MAX_OVERFLOW 和 TOTAL 。” python.org/dev/peps/pep-0008/…
标签: python dictionary configuration python-module