計算機科学のブログ

セイウチ演算子(walrus operator)でコードをちょっと短く、行数をちょっと少なく

奥村晴彦さん(Haruhiko Okumura @h_okumura)のCOCOAデータを読むのPythonのコードのインデントが深いのがちょっと気になったから、それを修正したコードを書いてみた。ついでに比較的最近追加されたセイウチ演算子(walrus operator)を利用して、ちょっとだけコードの行数を減らしてみた。

count.py

#!/usr/bin/env python3
import sys
import json


def show(filename, d):
    print()
    print(filename)
    for k in ["Hash", "MatchCount", "Timestamp"]:
        print(k, d[k])


def match_count(filename, d):
    if d['MatchCount'] != 0:
        show(filename, d)


for filename in sys.argv[1:]:
    with open(filename) as f:
        d = json.load(f)
    if (version := d["ExportVersion"]) == 1:
        for i in d["ExposureChecks"]:
            match_count(filename, i)
    elif version == 2:
        for i in d["ExposureChecks"]:
            for j in i["Files"]:
                match_count(filename, j)
    else:
        print(filename, "Unknown ExportVersion:", version)

これからもバージョンが増えていく場合は、セイウチ演算子を利用したのが多少役立つかも。

log.py

#!/usr/bin/env python3
import re
import sys
from zipfile import ZipFile


def show(name, z):
    with z.open(name) as f:
        for b in f:
            if re.search('^.*?,"Error",', (line := b.decode('utf-8')):
                print(line)


for arg in sys.argv[1:]:
    with ZipFile(arg) as z:
        for name in z.namelist():
            show(name, z)

1つ目のコードでshow関数が使われてたから、こちらもshow関数を定義して、ちょっとインデントの深さを減らしてみた。

どちらのコードも、修正したところで読みやすくなったかどうかは…

あと、手元にCOCOAデータのJSON形式のファイルがないから実際に動くかテストしてないです。