回答:
結局、try, except
とテストの違いlen(sys.argv)
はそれほど重要ではありません。どちらも、に比べて少しハックですargparse
。
しかし、これは私には起こります-一種の低予算のargparseとして:
arg_names = ['command', 'x', 'y', 'operation', 'option']
args = dict(zip(arg_names, sys.argv))
これを使用してnamedtuple
、デフォルトの値を持つを生成することもできますNone
-すべて4行です!
Arg_list = collections.namedtuple('Arg_list', arg_names)
args = Arg_list(*(args.get(arg, None) for arg in arg_names))
に慣れていない場合はnamedtuple
、オブジェクトのように機能するタプルにすぎないため、tup.attribute
構文ではなくtup[0]
構文を使用してその値にアクセスできます。
したがって、最初の行は、のnamedtuple
各値の値を持つ新しいタイプを作成しますarg_names
。2行目はargs
ディクショナリから値を渡し、get
指定された引数名がディクショナリに関連付けられた値を持たない場合にデフォルト値を返すために使用します。
の長さを確認してくださいsys.argv
:
if len(sys.argv) > 1:
blah = sys.argv[1]
else:
blah = 'blah'
あなたが提案した例外ベースのアプローチを好む人もいます(例:)が、try: blah = sys.argv[1]; except IndexError: blah = 'blah'
あまり適切に「スケーリング」されないため(たとえば、2つまたは3つの引数を受け入れたい場合)、私はそれほど好きではありません。エラーを隠す可能性blah = foo(sys.argv[1])
があります(たとえば、を使用したがをfoo(...)
発生させたIndexError
場合、それIndexError
は無視されます)。
try, except
。節foo
までの議論を待ってくださいelse
。
argparse
。
argparse.py
すべてのコマンドラインプロジェクトに参加しています。
try
節に入れています…ですから、難しくはない(そして、IMOは少しきれいです)ので、長さをチェックするだけです(また、フロー制御の例外を使用することをあなたに怒鳴る)。
try
お詫び申し上げます、認めなければなりません。それは時々、自分の意図をif
陳述よりも明確に表現していると感じています。
リストに載っていないもう1つの方法は、事前にセンチネル値を設定することです。このメソッドはPythonの遅延評価を利用します。この場合、常にelse
ステートメントを提供する必要はありません。例:
startingpoint = 'blah'
if len(sys.argv) >= 2:
startingpoint = sys.argv[1]
または、構文CRAZYを行う場合は、Pythonの三項演算子を使用できます。
startingpoint = sys.argv[1] if len(sys.argv) >= 2 else 'blah'
私はこれを使用します-失敗することはありません:
startingpoint = 'blah'
if sys.argv[1:]:
startingpoint = sys.argv[1]
startingpoint
例から変数を削除できますが、問題はフォールバック変数を割り当てることなので、同じようにしました。
sys.argv[1:]:
。これは位置引数で機能しますが、countは機能しません。
argv [1]の値をargvに追加し、argv [1]が入力した文字列と等しくないかどうかを確認できます。例:
from sys import argv
argv.append('SomeString')
if argv[1]!="SomeString":
print(argv[1])