◇pythonでのenumerate使用絶対禁止
Pythonではenumrateは絶対使用してはならない
Pythonではindex値の欲しいfor文ではenumateを用います。from typing import List _str_list:List[str]=['a','b',c'] for _index, _value in enumerate(_str_list,start=1): print(f"Index: {_index}, Value: {_value}")
これは絶対に避けなければならない最悪の方法です。
例えばPhthonでExcelを取り扱う次のようなプログラムがあったとします。
from typing import Tuple from openpyxl import load_workbook, Workbook from openpyxl.cell.cell import Cell # ファイル名設定等の処理 # Excelファイルを読み込む _wb:Workbook = load_workbook(_input_file) _color:str=None for _ws in _wb.worksheets: # _ws:Worksheet _index:int=0 for _row in _ws.iter_rows(): # _row:Tuple[Cell, ...] _index += 1 # _indexと_rowを使った処理上記コードはenumerateを用いず、index値を自力でカウントアップしています。C++やJavaに於ける通常のやり方です。
このコードは問題なく動作することを確認してあります。
これをPython風のindex管理にします。
from typing import Tuple
from openpyxl import load_workbook, Workbook
from openpyxl.cell.cell import Cell
# ファイル名設定等の処理
# Excelファイルを読み込む
_wb:Workbook = load_workbook(_input_file)
for _ws in _wb.worksheets:
# _ws:Worksheet
for _index, _row in enumerate(_ws.iter_rows(),start=1):
# _row:Tuple[Cell, ...]
# _index:int
# _indexと_rowを使った処理
このコードも動きます。ただし、データ量によっては、実用時間内に終了させることはできません。
同様のコードに見えますが、C++/Java風コードのfor文ではrowは一つずつ展開され処理されますが、enumerateを用いると、一旦全部展開し内部配列にしまった上で一つずつ処理する形になるためです。
問題は、このコードが「動くけど適切ではない」点です。
このようなコードがあった場合、遅延の原因を調べるのは難しくなります。
このようなコードが作られる可能性は排除されなければなりません。
通常のコードに於いてenumerateを使用する習慣がある場合、不適切な場面でも使用することは避けられません。
Pythonでのenumerateの使用は完全に禁止すべきなのです。
補足
| 固定リンク