2

スクリプトで次の行を読みました。

fn = (len(sys.argv) > 2 and [sys.argv[2]] or ['test_out.jpg'])[0]

ここで何が起こっているのかよくわかりません。そのため、引数の数を 2 と比較し、次に or ステートメントを比較します。作者はこれで何をしていて、それは良いコーディング スタイルですか?

4

3 に答える 3

5
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'
于 2013-10-02T11:54:51.547 に答える
3

個人的には、何が起こっているのかがそれほど明白ではないため、コーディングスタイルが悪いと思います(したがって、あなたの質問です)。

それが何をしているのか:

  1. sys.argv2 つ以上のアイテムがあるかどうかを確認する
  2. 2点以上の場合は返品[sys.argv[2]]
  3. それ以外の場合は、戻る['test_out.jpg']
  4. 前に返されたアイテム (常にリスト) から、アイテム 0 を返します。

より単純なバージョンは次のようになります。

fn = sys.argv[2:] and sys.argv[2] or 'test_out.jpg'

より読みやすいバージョン:

fn = sys.argv[2] if sys.argv[2:] else 'test_out.jpg'
于 2013-10-02T11:57:02.370 に答える
0

andPython では、or場合によっては短絡のように振る舞います。

x and yで x が と評価された場合False、結果が false になるため、y を見る必要さえありません。を取得したいとしますがsys.argv[2]、十分な引数がある場合のみです。次に、次のことができます。

len(sys.argv) > 2 および [sys.argv[2]]

そのため、sys.argv長さが 2 以下の場合はlen(sys.argv) > 2false と評価され、評価されませんsys.argv[2](したがって、 に遭遇しませんIndexError)。

同様に、式では、 が に評価されるx or y場合にのみ評価されます。したがって、引数の数が 2 以下の場合、値は になります。xFalseyfn['test_out.jpg']

最後に、角かっこは[0]、式の最終を使用してゼロ番目のインデックスを取得するためのものです。

要約すると、引数の数が 2 つ以上の場合は に割り当てfnsys.argv[2]それ以外の場合は に割り当てfnます'test.out.jpg'

于 2013-10-02T12:05:42.490 に答える