optparseを使用して引数を受け入れるほとんどのpythonicの方法に対する受け入れられた回答で説明されているように、文字列に対して操作を実行する関数を備えたプログラムがあります。プログラムはargparseを使用して、文字列がそのまま提供されているかファイルで提供されているかを確認し、必要に応じて入力をマッサージして関数に渡します。
ここで、関数のより高度なバージョンでプログラムを拡張したいのですが、スクリプトで2つの関数のうちの1つを実行するためにargparseを使用する場合のように、比較のために基本バージョンを残しておきます。私の状況が異なると思うのは、呼び出される関数に関係なく、既存の入力フラグも渡すオプションが必要なことです。
パーサーに新しい引数を追加し、そのフラグをチェックするif / else内に以前のコードをネストするだけでは、機能しません。引数の数が間違っていると文句を言います。私はサブコマンドを知っていますが、argparseはまだかなり新しいので、それは私が望むものにはやり過ぎのようですが、そうではないかもしれません。
tl; dr:2つの関数の1つと2つの入力タイプの1つを選択する必要があります。両方の入力タイプが両方の関数に適用されます。助けてくれてありがとう!
コードを追加するために編集:
p = argparse.ArgumentParser(description="program.py")
p.add_argument("-e", dest='extended') #The new flag causing the trouble
p.add_argument("-s", dest="string")
p.add_argument("-f", dest="infile")
args = p.parse_args()
if args.extended:
if args.infile:
with open(args.infile,'r') as f:
for line in enumerate(f.readlines()):
print 'Input: ', line[1],
output = funcExtended(line[1]) #new and improved function
print 'Extended output: ', output
elif args.string:
output = funcExtended(args.string)
print output
else: #my future default option to grab strings from a database
print 'This will soon work: extended'
else: #I fully realize that I shouldn't have to essentially copy and paste here
if args.infile:
with open(args.infile,'r') as f:
for line in enumerate(f.readlines()):
print 'Input: ', line[1],
output = funcBasic(line[1]) #old and tired function
print 'Basic output: ', output
elif args.string:
output = funcBasic(args.string)
print output
else: #my future default option to grab strings from a database
print 'This will soon work: basic'
これはコマンドラインユーティリティです。発行
$ python program.py -s 'string'
以前と同様に、適切にフォーマットされた文字列を返します。しかし、発行
$ python program.py -s 'string' -e
戻り値
program.py: error: argument -e: expected one argument
ふぅ。助けてくれる人にもう一度感謝します!