我有一个类,它有大约十几个对象变量。除了每个变量,我还想提供一个默认值、一个帮助字符串(用于 argparse)和一个注释字符串(用于写入数据文件)。我希望能够通过以下方式实例化对象:
- 为 init 方法提供显式值
- 提供在命令行上使用的值
- 采用默认值
- 以上的一些组合。
当我只有两个对象变量时,我在 init 函数的声明中提供了默认值,我在创建参数解析器时复制了这些和帮助字符串等。但是对于许多变量,它变得非常混乱。
下面精简的示例代码是我当前的解决方案,我对此非常满意,完全符合我的要求,并且运行良好。但是,我有两个问题:
- 它是pythonic吗?
- 当然,这一定是一个已经解决的问题,并且有一种“标准”的方式来做到这一点?
我确实在这里环顾四周,并用谷歌搜索了一下,但我没有找到现有的解决方案。
# invoke with python demoArgs.py -a 15 -b 25 -c text
import argparse
class Foo:
defaults = {'a':10,'b':20, 'c':"outFile"}
helpDefs = {'a' : 'the first parameter',
'b' : 'the second paramter',
'c' : 'the third paramter'}
@staticmethod
def parse_args():
parser = argparse.ArgumentParser()
for key in Foo.defaults:
parser.add_argument('-'+ key, help = Foo.helpDefs[key],
default = Foo.defaults[key])
return vars(parser.parse_args())
def __init__(self, a = defaults['a'], b = defaults['b'], c = defaults['c']):
self.a = a
self.b = b
self.c = c
def report(self):
for key in sorted(vars(self)):
print key, "val = ", getattr(self,key), \
", help = ", self.helpDefs[key], \
", def = ", self.defaults[key]
def main():
print "\n an object using all of the defaults"
a = Foo()
a.report()
print "\n an object using the command line values"
args = Foo.parse_args()
b = Foo(**args)
b.report()
print "\n an object using values specified in the code"
c = Foo(30,40,"object")
c.report()
print "\n an object using a perverse combination"
args = Foo.parse_args()
d = Foo(50, c = args['c'])
d.report()
if __name__ == '__main__':
main()