このような行があります:
filter(lambda x: x == 1, [1, 1, 2])
Pylintは警告を表示しています:
W: 3: Used builtin function 'filter'
何故ですか?リストの理解は推奨される方法ですか?
もちろん、これを次のように書き換えることができます。
[x for x in [1, 1, 2] if x == 1]
また、警告は表示されませんが、このためのPEPがあるかどうか疑問に思っていましたか?
Pylintは、すべきではないことについてよくしゃべります。 .pylintrcファイルで警告を無効にできます。
このページ http://pylint-messages.wikidot.com/messages:w0141 は、フィルターとマップがリスト内包表記に取って代わられていることを示しています。
Pylintrcファイルに次のような行を追加すると、警告が静かになります。
disable=W0141
何故ですか?リストの理解は推奨される方法ですか?
リスト内包表記は チュートリアルの例 で推奨されています。
より簡潔で読みやすいです。
sOのほとんどの回答者 Pythonリストの理解とマップ ここで それは
filter
を定義している場合、lambda
よりもリスト内包表記を使用する方が効率的ですfilter
を使用するfilter
およびmap
を使用する必要があります。map
、map
、またはTL; DR:ほとんどの場合、リストの内包表記を使用します
私は同じ問題に遭遇し、理解できませんでした
なぜ組み込み関数「input」が悪いのか。私はあなたが意図する
無効にするには:
pylint --bad-functions = "[map、filter、apply]" YOUR_FILE_TO_CHECK_HERE
設定が気に入ったら:
pylint --bad-functions="[map,filter,apply]" --some-other-supercool-settings-of-yours
--generate-rcfile > test.rc
設定がファイルにあることを確認します。例:
cat test.rc | grep -i YOUR_SETTING_HERE
その後、このファイルをローカルで使用できます
pylint --rcfile test.rc --your-other-command-line-args ...
または、デフォルトのrcfileとして使用します。このために私は親切にあなたを参照してください
pylint --long-help
プロジェクトでも同じ警告が表示されます。ソースコードをpy2/3互換になるように変更していますが、pylintは非常に役立ちます。
_pylint --py3k
_を実行すると、互換性に関するエラーのみが表示されます。
python 2で、filter
を使用する場合、list
を返します。
_>>> my_list = filter(lambda x: x == 1, [1, 1, 2])
>>> my_list
[1, 1]
>>> type(my_list)
<type 'list'>
_
ただし、python 3、filter
および他の同様のメソッド(map
、range
、Zip
、..)互換性のない型であり、おそらくコードにバグを引き起こすイテレータ。
_>>> my_list = filter(lambda x: x == 1, [1, 1, 2])
>>> my_list
<filter object at 0x10853ac50>
>>> type(my_list)
<class 'filter'>
_
コードをpython 2/3互換にするために、 python future site のチートシートを使用します
この警告を回避するには、python 2および3で機能する4つのアプローチを使用できます。
1-あなたが言ったようにリストの理解を使用します。
2-list
関数を使用して、戻り値が常にマテリアライズドリストであることを許可します。結果は両方のpythonバージョンで同じです
_>>> list(filter(lambda x: x == 1, [1, 1, 2]))
[1, 1]
_
3-lfilter
を使用して、これは将来のパッケージのインポートです。常にリストを返し、py2でフィルターを使用し、py3でlist(filter(..)
を使用します。そのため、両方のpythonの動作が同じになり、より簡潔な構文が得られました。
_>>> from future.utils import lfilter
>>> lfilter(lambda x: x == 1, [1, 1, 2])
[1, 1]
_
4-最高!常にループでfilter
を使用します。これにより、pylintは警告を発せず、python 3でのパフォーマンスが向上します。
_>>> for number in filter(lambda x: x == 1, [1, 1, 2]):
>>> print(number)
>>> 1
>>> 1
_
python 3で動作する関数を常に優先します。なぜなら、python 2は間もなく廃止されるためです。