約12個のオブジェクト変数を持つクラスがあります。各変数とともに、デフォルト値、ヘルプ文字列 (argparse 用)、およびコメント文字列 (データ ファイルに書き込むため) を提供したいと考えています。次の方法でオブジェクトをインスタンス化できるようにしたい:
- init メソッドに明示的な値を提供する
- コマンドラインで使用する値を提供する
- デフォルトを取る
- 上記のいくつかの組み合わせ。
オブジェクト変数が 2 つしかないときは、init 関数の宣言でデフォルトを指定し、引数パーサーを作成するときにこれらとヘルプ文字列を複製しました。しかし、多くの変数では、非常に面倒です。
以下の縮小されたサンプル コードは、私の現在のソリューションであり、かなり満足しており、私が望んでいることを正確に実行し、非常にうまく機能します。しかし、2 つの質問があります。
- それは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()