スクリプトで次の行を読みました。
fn = (len(sys.argv) > 2 and [sys.argv[2]] or ['test_out.jpg'])[0]
ここで何が起こっているのかよくわかりません。そのため、引数の数を 2 と比較し、次に or ステートメントを比較します。作者はこれで何をしていて、それは良いコーディング スタイルですか?
スクリプトで次の行を読みました。
fn = (len(sys.argv) > 2 and [sys.argv[2]] or ['test_out.jpg'])[0]
ここで何が起こっているのかよくわかりません。そのため、引数の数を 2 と比較し、次に or ステートメントを比較します。作者はこれで何をしていて、それは良いコーディング スタイルですか?
fn = (len(sys.argv) > 2 and [sys.argv[2]] or ['test_out.jpg'])[0]
のようなものです:
fn = ([sys.argv[2]] if len(sys.argv) > 2 else ['test_out.jpg'])[0]
平易な声明では:
if len(sys.argv) > 2:
fn = [sys.argv[2]][0]
else:
fn = ['test_out.jpg'][0]
ご覧[...][0]
のとおり、やや冗長です。したがって、元のステートメントは次のように置き換えることができます。
fn = len(sys.argv) > 2 and sys.argv[2] or 'test_out.jpg'
更新sys.argv[2]
空の文字列の場合、上記のコードは機能しません。そのため、元のコードは[...][0]
フォームを使用します。したがって、可能であれば次の形式を使用してください。
fn = sys.argv[2] if len(sys.argv) > 2 else 'test_out.jpg'
個人的には、何が起こっているのかがそれほど明白ではないため、コーディングスタイルが悪いと思います(したがって、あなたの質問です)。
それが何をしているのか:
sys.argv
2 つ以上のアイテムがあるかどうかを確認する[sys.argv[2]]
['test_out.jpg']
より単純なバージョンは次のようになります。
fn = sys.argv[2:] and sys.argv[2] or 'test_out.jpg'
より読みやすいバージョン:
fn = sys.argv[2] if sys.argv[2:] else 'test_out.jpg'
and
Python では、or
場合によっては短絡のように振る舞います。
式x and y
で x が と評価された場合False
、結果が false になるため、y を見る必要さえありません。を取得したいとしますがsys.argv[2]
、十分な引数がある場合のみです。次に、次のことができます。
len(sys.argv) > 2 および [sys.argv[2]]
そのため、sys.argv
長さが 2 以下の場合はlen(sys.argv) > 2
false と評価され、評価されませんsys.argv[2]
(したがって、 に遭遇しませんIndexError
)。
同様に、式では、 が に評価されるx or y
場合にのみ評価されます。したがって、引数の数が 2 以下の場合、値は になります。x
False
y
fn
['test_out.jpg']
最後に、角かっこは[0]
、式の最終を使用してゼロ番目のインデックスを取得するためのものです。
要約すると、引数の数が 2 つ以上の場合は に割り当てfn
、sys.argv[2]
それ以外の場合は に割り当てfn
ます'test.out.jpg'
。