【问题标题】:Dynamic entries in a settings module设置模块中的动态条目
【发布时间】: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


【解决方案1】:

您希望为执行波浪分析的函数配置在字典中结构化的通用和特定设置。

首先定义一个设置类,例如:

class Settings :

  data_directory = 'path/to/waves'

  def __init__(self, model):         
     self.parameters= {
       "key1":{
           "subkey1":0,
           "subkey2":0
       },
       "key2":{
           "subkey1":model
       }
     }

# create a new class based on model1
s1 = Settings('model1')
# attribute values to specific keys
s1.parameters["key1"]["subkey1"] = 3.1415926
s1.parameters["key1"]["subkey2"] = 42
# an other based on model2
s2 = Settings('model2')
s2.parameters["key1"]["subkey1"] = 360
s2.parameters["key1"]["subkey2"] = 1,618033989
# load the audio
wavs = openWaves(Settings.data_directory)
# process with the given parameters
results1 = processWaves(wavs,s1)
results2 = processWaves(wavs,s2)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-27
    相关资源
    最近更新 更多