5

Python では、リスト内包表記を使用すると実装がいかに簡潔になるかを本当に楽しんでいます。私はこれを簡潔なリスト内包表記にするのが大好きです:

myList = [1, 5, 11, 20, 30, 35] #input data
bigNumbers = [x for x in myList if x > 10]

ただし、次のようなより冗長な実装によく遭遇します。

myList = [1, 5, 11, 20, 30, 35] #input data
bigNumbers = []
for i in xrange(0, len(myList)):
    if myList[i] > 10:
        bigNumbers.append(myList[i])

for loopが 1 つのデータ構造 (例: ) だけを参照する場合、myList[]通常、ループと同等の単純なリスト内包ステートメントが存在します。
これを念頭に置いて、冗長な Python ループを簡潔なリスト内包ステートメントに変換するリファクタリング ツールはありますか?


以前の StackOverflowの 質問では、ループをリスト内包表記に変換するためのアドバイスが求められました。しかし、ループをリスト内包表記に自動的に変換することに関する質問はまだ見つかっていません。


動機:「コードがクリーンであるとはどういう意味ですか?」という質問に答える方法はたくさんあります。個人的には、コードを簡潔にして無駄をなくすと、コードがすっきりして読みやすくなる傾向があることがわかりました。当然、「簡潔なコード」と「理解できないワンライナー」の間には境界線があります。それでも、簡潔なコードを書いて操作することに満足感を覚えることがよくあります。

4

1 に答える 1

5

2to3は、構文パターンで指定できる限り、任意のリファクタリングを実行できるリファクタリング ツールです。あなたが探したいかもしれないパターンはこれです

VARIABLE1 = []
for VARIABLE2 in EXPRESSION1:
    if EXPRESSION2:
        VARIABLE1.append(EXPRESSION3)

これは安全にリファクタリングできます

VARIABLE1 = [EXPRESSION3 for VARIABLE2 in EXPRESSION1 if EXPRESSION2]

あなたの特定の例では、これは

bigNumbers = [myList[i] for i in xrange(0, len(myList)) if myList[i] > 10]

次に、xrange(0, N) を xrange(N) に置き換える別のリファクタリングと、

[VARIABLE1[VARIABLE2] for VARIABLE2 in xrange(len(VARIABLE1)) if EXPRESSION1]

[VARIABLE3 for VARIABLE3 in VARIABLE1 if EXPRESSION1PRIME]

このリファクタリングにはいくつかの問題があります。

  • EXPRESSION1PRIMEEXPRESSION1すべての出現 VARIABLE1[VARIABLE2]箇所を VARIABLE3 に置き換える必要があります。これは 2to3 で可能ですが、トラバーサルと置換を行うには明示的なコードが必要です。
  • EXPRESSION1PRIMEthen には、これ以上 が含まれていてはなりません VARIABLE1。これは、明示的なコードでも確認できます。
  • VARIABLE3 の名前を考える必要があります。を選択しましたx。これを自動的に行う合理的な方法はありません。そのためにリサイクルVARIABLE1(つまり) を選択することもできますが、それはまだインデックスiであることを示唆しているため、混乱を招く可能性があります。(つまり)iなどの合成名を選択し、それが他の方法で使用されていないかどうかを確認するとうまくいく場合があります。VARIABLE1_VARIABLE2myList_i
  • VARIABLE1[VARIABLE2] が を使用したときと同じ結果になることを確認する必要がありますiter(VARIABLE1)。これを自動的に行うことはできません。

2to3 フィクサーの書き方を知りたい場合は、Lennart Regebro の本を読んでください。

于 2013-01-25T14:56:56.507 に答える