在Python中处理大量输入变量的最佳方法是什么?
我正在开发一个科学软件包,用来模拟一个生物系统,所以我选择了Python来实现这个项目。我的程序需要用很多输入数据和变量来初始化。在研究了一段时间后,我决定使用JSON格式的文件作为输入,这个文件里包含了数据和变量。
不过,我不太确定这样做是否正确。我现在的做法是读取一个JSON文件,然后把它放进一个Python字典里。接着,在类的__init__
方法中,我声明了很多和字典里名字相同的变量。比如,如果JSON里有一个项叫params
,那么我就会声明一个变量self.params = json["params"]
。
现在我在想,我是不是应该这样做,还是可以在初始化时直接声明一个大的字典,比如self.options = json
,然后在类里使用这个字典。如果我这样做,首先我的代码会显得很乱;其次,每次我想从self.options
读取一个变量时,Python都要访问一大块数据,这样可能没有直接使用类变量来得高效,是这样吗?
除了我描述的这种方法,还有什么其他方式可以处理程序中的大量输入参数呢?
2 个回答
除了我刚才说的方法,还有什么其他方式可以处理程序中的大量输入参数呢?
我比较喜欢的处理大量输入参数的方法是使用 configparser模块。
对我来说,一个主要的好处是可以实现“分层配置”。也就是说,可以提供一个 default.ini
的配置文件,里面有一些合理的默认值。然后,用户可以用自定义的配置文件来覆盖这些默认值,以适应特定的使用场景或不同的网站。
因为你的配置选项看起来比较复杂,所以创建一个专门处理配置的类是个好主意。这样可以把所有需要了解配置文件结构的代码放到这个类里,其他部分的应用就不需要知道这些细节了。
你可以把 self.options
设置为这个类的一个实例,然后用它的方法和属性来访问你的选项。这样不仅可以用 self.options.foo.bar
来代替 self.options["foo"]["bar"]
,还可以提供一些实际的访问方法,从配置文件中计算出派生的选项。没有具体的选项类型,很难给出例子。
要实现这个,你可以加载 JSON 结构并传递给你的类进行初始化,或者使用 json.load
的 object_hook
参数(文档)来创建自定义类,这样你就可以按照你想要的类结构来读取 JSON 信息。
举个例子(这个例子有点粗糙,生产代码中你可能想要更干净的版本):
class Bag(dict):
def __getattr__(self, name):
if name in self:
return self[name]
else:
raise AttributeError
>>> import json
>>> x = json.loads('{"foo": {"bar": 23}}', object_hook=Bag)
>>> x.foo.bar
23
如果使用 ConfigParser
模块而不是 JSON,配置文件对人类来说会更易读一些,但创建一个自定义配置类以便更方便地访问的想法还是一样的。