この質問にはすでに非常に賛成の回答と受け入れられた回答がたくさんありましたが、ブール問題を表現するさまざまな方法に気を取られて、重要なポイントを逃しました:
ゼロまたは3つのコマンドライン引数を受け取ることができるpythonスクリプトがあります。(デフォルトの動作で実行するか、3つの値すべてを指定する必要があります)
このロジックは、そもそもコードの責任ではなく、argparse
モジュールで処理する必要があります。複雑なifステートメントを作成する必要はありません。代わりに、次のような引数パーサーを設定することをお勧めします。
#!/usr/bin/env python
import argparse as ap
parser = ap.ArgumentParser()
parser.add_argument('--foo', nargs=3, default=['x', 'y', 'z'])
args = parser.parse_args()
print(args.foo)
そして、はい、それは結局のところオプションなので、位置引数ではなくオプションであるべきです。
編集: コメントでのLarsHの懸念に対処するために、位置引数が3または0のインターフェイスが必要であることが確実である場合に、それを記述する方法の例を以下に示します。オプションの引数は optionsでなければならないため、以前のインターフェースの方がスタイルが良いと私は考えていますが、ここでは完全性のために代替のアプローチを示します。usage
パーサーを作成するときは、上書きするkwargに注意してくださいargparse
。そうしないと、誤解を招く使用方法のメッセージが自動生成されます。
#!/usr/bin/env python
import argparse as ap
parser = ap.ArgumentParser(usage='%(prog)s [-h] [a b c]\n')
parser.add_argument('abc', nargs='*', help='specify 3 or 0 items', default=['x', 'y', 'z'])
args = parser.parse_args()
if len(args.abc) != 3:
parser.error('expected 3 arguments')
print(args.abc)
以下に使用例をいくつか示します。
# default case
wim@wim-zenbook:/tmp$ ./three_or_none.py
['x', 'y', 'z']
# explicit case
wim@wim-zenbook:/tmp$ ./three_or_none.py 1 2 3
['1', '2', '3']
# example failure mode
wim@wim-zenbook:/tmp$ ./three_or_none.py 1 2
usage: three_or_none.py [-h] [a b c]
three_or_none.py: error: expected 3 arguments