2

我有一个类,它有大约十几个对象变量。除了每个变量,我还想提供一个默认值、一个帮助字符串(用于 argparse)和一个注释字符串(用于写入数据文件)。我希望能够通过以下方式实例化对象:

  1. 为 init 方法提供显式值
  2. 提供在命令行上使用的值
  3. 采用默认值
  4. 以上的一些组合。

当我只有两个对象变量时,我在 init 函数的声明中提供了默认值,我在创建参数解析器时复制了这些和帮助字符串等。但是对于许多变量,它变得非常混乱。

下面精简的示例代码是我当前的解决方案,我对此非常满意,完全符合我的要求,并且运行良好。但是,我有两个问题:

  1. 它是pythonic吗?
  2. 当然,这一定是一个已经解决的问题,并且有一种“标准”的方式来做到这一点?

我确实在这里环顾四周,并用谷歌搜索了一下,但我没有找到现有的解决方案。

# 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()
4

1 回答 1

0

至于它是“pythonic” - 我会说不。Argparse 已经非常强大了。想要使用您的库的人必须仔细了解它是如何工作的以及它是如何包装其他东西的(这也需要了解它包装的东西)。这种努力是否值得值得商榷。在短期内,你最好只使用 argparse,而不是试图简化已经完成工作的东西(恕我直言)。

至于问题 #2——我严重怀疑其他人是否尝试过这样做。大多数人通常会坚持使用标准库。它更简单,可在所有可以运行 python 的平台上使用。

当然,这些答案都不应该阻止你做你喜欢做的事。

于 2015-12-11T18:04:27.740 回答