1

最初の引数がargparseで指定されていない場合、別の引数変数でもある変数を使用することは可能ですか?

したがって、次のコードでは:

import argparse
parser = argparse.ArgumentParser()
parser.add_option('-f', '--file', dest='outputfile')
parser.add_option('-d', '--db', dest='outpufDB')

上記のスクリプトを 経由script.py -f file_nameで実行し、引数 on を指定しないoutputDB場合、 on と同じ値を on に設定outputDBoutputfileます。引数を使用してデフォルト値を設定できることは知ってdefaultいますが、別の引数から派生したデフォルト値を設定することもできますか?

ありがとう。

4

3 に答える 3

0

簡単なアプローチ - parse_args の後に独自のチェックを行います。

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-f', '--file', dest='outputfile')
parser.add_argument('-d', '--db', dest='outpufDB')
args = parser.parse_args()
if args.outpufDB is None: 
    args.outpufDB = args.outputfile

デフォルトのデフォルト値はNone、簡単にテストできる です。

argparseに反映されている場合、helpまたは標準化エラー メッセージが必要な場合は、完全に内部で何かを行うと便利です。ただし、解析後にデフォルトを入力しているだけです。

カスタム '-f' アクションで同じことを行うことは想像できますが、ロジックはより複雑になります。

于 2013-08-16T23:49:29.387 に答える
0

これを行う従来の方法 (人々が C で古い Unix getopt に戻った方法) はoutputDB、役に立たない「センチネル」のデフォルト値を与えることです。次に、解析を行った後outputDB、センチネルと一致する場合は、outputfile代わりに の値を使用します。


default利用可能なすべてのオプションの詳細については、ドキュメントを参照してください。しかし、他のパラメーターを壊さない限り、最も簡単なのは、それをオフにして渡すことのようargument_default=SUPPRESSです。その場合args.outputDB、何も渡されなかった場合は存在しないため、hasattrorinまたはで確認できますtry


または、空の文字列をデフォルトとして渡すこともできますが、もちろん、ユーザーはいつでも で同じことをトリガーでき--outputDB=''ますが、これを許可したくない場合があります。

これを回避するために、 を与えることはできませんtype。つまり、文字列ではないデフォルト値を与えることができ、ユーザーが同じものを渡すことはできません。None適切な型のfalsey値が使用できない場合にセンチネルを取得するpythonicの方法は次のとおりです。

sentinel = object()
x = do_stuff(default_value=sentinel)
# ... 
if x is sentinel:
    # x got the default value

しかし、ここではそれは必要ないと思います。デフォルトNoneはまったく問題ないはずです (文字列しか指定できないため、ユーザーがそれを指定する方法はありません)。


argparse私が発見していない、これを行うためのさらにクールな方法がある可能性は十分にあります。そのため、他の回答が得られるまでしばらくお待ちください。)

于 2013-08-16T22:58:46.997 に答える
0

これが良い方法かどうかはわかりませんが、同様の問題でこれを試しました。コードに次のスニペットを適用しました。お役に立てば幸いです。

import argparse
parser = argparse.ArgumentParser()
parser.add_option('-f', '--file', dest='outputfile', default='dummy_file')
parser.add_option('-d', '--db', dest='outputDB', default=parser.parse_args().outputfile)

両方の名前に引数を渡さない場合、'outputfile' と 'outputDB' は 'dummy_file' になります。

于 2015-04-29T22:01:08.403 に答える