はじめに #
PythonでPylintを使用したときに表示されるリファクタリングメッセージR1721(不要な内包表記)を抑制する方法を解説します。
Pythonの内包表記は処理が高速なためよく使用しますが、冗長になる場合があります。静的解析ツールPylintを使用すると、R1721として表示されます。Rはコードをリファクタリングすべきことを意味します。
この記事で検証したバージョンは以下の通りです。
- OS: Windows 10 Home
- Python 3.11.6
- Pylint 3.0.2
辞書 (dict) 内包表記と集合 (set) 内包表記を例に示します。
辞書内包表記のR1721 #
以下のような辞書内包表記で、辞書を作るスクリプトを例に示します。
array = ["a", "b", "c"]
d = {i:v for i,v in enumerate(array)}
# d = {0: 'a', 1: 'b', 2: 'c'}
これをPylintで解析すると、以下の結果になります。
R1721: Unnecessary use of a comprehension, use dict(enumerate(array)) instead. (unnecessary-comprehension)
内包表記ではなく、組込み関数のdict()
を使用せよと表示されます。辞書のキーを処理せずにそのまま使用する場合、R1721が出力されます。リファクタリング後のコードは以下になります。
array = ["a", "b", "c"]
d = dict(enumerate(array))
集合内包表記のR1721 #
以下のような集合内包表記で、集合を作るスクリプトを例に示します。
array2 = ["a", "a", "b", "c", "c"]
s = {a for a in array2}
# s = {'a', 'b', 'c'}
これをPylintで解析すると、以下の結果になります。
R1721: Unnecessary use of a comprehension, use set(array2) instead. (unnecessary-comprehension)
内包表記ではなく、組込み関数のset()
を使用せよと表示されます。要素を処理せずにそのまま使用する場合、R1721が出力されます。リファクタリング後のコードは以下になります。
array2 = ["a", "a", "b", "c", "c"]
s = set(array2)