セイウチ志向から逃れられない – python 3.8 からの the walrus operator と、ついでに 3.6 からの f-string という名の呪縛

だからねぇ、もう 2.7 だの 3.5 だの言い続けたくないわけよ。

C/C++ 開発経験者ほど the walrus operator を使い始めたら、元に戻れないんじゃないかなと思うわけね:

juman -S で起動した JUMAN サーバを相手にするクライアント
 1 # -*- coding: utf-8 -*-
 2 import socket
 3 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 4 sock.connect(("localhost", 32000))
 5 opt = "RUN -e2\n"
 6 resp = sock.makefile(encoding="utf-8", newline="\n")
 7 print(resp.readline().rstrip())
 8 if opt:
 9     sock.send(opt.encode())
10     print(resp.readline().rstrip())
11 
12 sock.send("この星で一等賞になりたいの卓球で俺は\n".encode("utf-8"))
13 while (line := resp.readline()) != "EOS\n":
14     print(line.rstrip())
15 
16 sock.close()

この「:=」部分のノリがまさに、1970年代に誕生した C のノリと全く同じなわけね。違いは「= ではなく専用の := である」ということだけで、「C/C++ 脳」のまんまコーディング出来るというわけだわな。けれども、「python 3.7 で動かす必要がある」なんてのはまだまだいっくらでもあるわけで、スクラッチでこのコードを書いてしまったあとで、3.7 対応のために「:= がなかった世界」で再構築する必要がある。これがまぁなんというか、ずっとずっとストレスを感じ続けたものであるし、少しは慣れてくれても良さそうなものだが、全然置き換えコードが即座に出てこない。困ったもんだ。たぶんこうだよな?:

 1 # -*- coding: utf-8 -*-
 2 import socket
 3 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 4 sock.connect(("localhost", 32000))
 5 opt = "RUN -e2\n"
 6 resp = sock.makefile(encoding="utf-8", newline="\n")
 7 print(resp.readline().rstrip())
 8 if opt:
 9     sock.send(opt.encode())
10     print(resp.readline().rstrip())
11 
12 sock.send("この星で一等賞になりたいの卓球で俺は\n".encode("utf-8"))
13 #while (line := resp.readline()) != "EOS\n":
14 #    print(line.rstrip())
15 while True:
16     line = resp.readline()
17     if line == "EOS\n":
18         break
19     print(line.rstrip())
20 
21 sock.close()

ちぅわけで、このセイウチ演算子は本当に待ちに待ったものであると同時に、頭痛の種でもあるというわけだわな。

ちなみにこれ、いわゆる「ヨーダ」テクニックを愛するステキな大人はそもそも使っちゃダメですからね。だって、判定を逆転させないと世界が破滅するんでしょ? := ではそれが出来ないのだから、:= は「コーディグ規約違反」、だろ?

f-string はそれとはちょっと違うけれど、「drop python 3.6 support」を宣言したプロジェクトが本当に喜んで飛びついていて、3.5 だの 3.6 で動かさなければならないプロジェクトが依存ライブラリで問題を起こす場合、真っ先に f-string が引っかかる。2.x から 3.x での print 同様に、目立つのよね、わかりやすい問題とも言える。

そうはいってもこの f-string も、いったん使い始めるとすぐに手癖になってしまいがちで、結構困る。3.5 で動かさなければならない、というのは本来あんまり許されて欲しくはないんだけれど、色々な事情で 3.5 のまま使い続けなければならないなんてのはまだ結構あって、そこでも f-string をチマチマ str.format に戻していかねばならんのも悩みの種なのよね。

オマケ。

「juman -S で起動した JUMAN サーバ」な docker 例:

Dockerfile
 1 FROM ubuntu
 2 
 3 ENV DEBIAN_FRONTEND=noninteractive
 4 SHELL ["/bin/bash", "-c"]
 5 RUN apt-get update -y && apt-get upgrade
 6 
 7 RUN apt-get install -yq juman
 8 
 9 EXPOSE 32000
10 
11 WORKDIR /app
12 RUN printf '#! /bin/sh\njuman -S\nexec "$@"' > /app/entrypoint.sh && chmod u+x /app/entrypoint.sh
13 ENTRYPOINT ["/app/entrypoint.sh"]
14 CMD ["bash"]

run 時は「-p=32000:32000」(等)を忘れずに。