web-dev-qa-db-ja.com

Pylintが組み込み関数を好まないのはなぜですか?

このような行があります:

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があるかどうか疑問に思っていましたか?

72
igorgue

Pylintは、すべきではないことについてよくしゃべります。 .pylintrcファイルで警告を無効にできます。

このページ http://pylint-messages.wikidot.com/messages:w0141 は、フィルターとマップがリスト内包表記に取って代わられていることを示しています。

Pylintrcファイルに次のような行を追加すると、警告が静かになります。

disable=W0141
93
Ned Batchelder

何故ですか?リストの理解は推奨される方法ですか?

リスト内包表記は チュートリアルの例 で推奨されています。

より簡潔で読みやすいです。

sOのほとんどの回答者 Pythonリストの理解とマップ ここで それは

  1. 毎回filterを定義している場合、lambdaよりもリスト内包表記を使用する方が効率的です
  2. 多分より読みやすい(および同様の効率で)関数が事前定義されている場合はfilterを使用する
  3. の場合、filterおよびmapを使用する必要があります。
    • マップmap
    • カレーmap、または
    • 関数型プログラミングを使用する

TL; DR:ほとんどの場合、リストの内包表記を使用します

10
serv-inc

私は同じ問題に遭遇し、理解できませんでした

なぜ組み込み関数「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
5
benjamin

プロジェクトでも同じ警告が表示されます。ソースコードを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および他の同様のメソッド(maprangeZip、..)互換性のない型であり、おそらくコードにバグを引き起こすイテレータ。

_>>> 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は間もなく廃止されるためです。

1