2

約12個のオブジェクト変数を持つクラスがあります。各変数とともに、デフォルト値、ヘルプ文字列 (argparse 用)、およびコメント文字列 (データ ファイルに書き込むため) を提供したいと考えています。次の方法でオブジェクトをインスタンス化できるようにしたい:

  1. init メソッドに明示的な値を提供する
  2. コマンドラインで使用する値を提供する
  3. デフォルトを取る
  4. 上記のいくつかの組み合わせ。

オブジェクト変数が 2 つしかないときは、init 関数の宣言でデフォルトを指定し、引数パーサーを作成するときにこれらとヘルプ文字列を複製しました。しかし、多くの変数では、非常に面倒です。

以下の縮小されたサンプル コードは、私の現在のソリューションであり、かなり満足しており、私が望んでいることを正確に実行し、非常にうまく機能します。しかし、2 つの質問があります。

  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