積雲が映像制作したMV『RANGEFINDER』公開中
専門88IO

PythonでPythonコードを生成するTIPS

専門

クラスのメンバ等で類似したコードを記述する場合、単調に全部書くのは面倒に感じる。またA = '0x0001'のように[A-Z]を記述する際はエディタの機能で補えなかったりする。

こんな時はPythonでコードを生成するのもひとつの手。

ポイントとなるのは、int型のUnicodeを文字に変換するchrと文字をUnicodeに変換するord

  • chr(int) :  Unicode → 文字
  • ord(str) :  文字 → Unicode

絵文字のUnicode対応付けを例に進める。🇦(Regional Indicator Symbol Letter A)\U0001F1E6で表す。Unicodeポイントから対応する文字を推測するのは難しく、可読性が下がる原因にもなり得る。予めA = '\U0001F1E6'と記述しておきた方が良いだろう。

[A-Z]のUnicodeポイントは連番なのでループ処理によって生成できる。

文字 16進数 10進数
A 0x41 65 ( = ord(‘A’) )
🇦 0x0001F1E6 127462 ( = ord(‘\U0001F1E6’) )

であることから、

for i in range(26):
  print("{} = '\\U{:08X}'".format(chr(65 + i), 127462 + i))
A = ‘\U0001F1E6’
B = ‘\U0001F1E7’
C = ‘\U0001F1E8’
D = ‘\U0001F1E9’
E = ‘\U0001F1EA’
F = ‘\U0001F1EB’
G = ‘\U0001F1EC’
H = ‘\U0001F1ED’
I = ‘\U0001F1EE’
J = ‘\U0001F1EF’
K = ‘\U0001F1F0’
L = ‘\U0001F1F1’
M = ‘\U0001F1F2’
N = ‘\U0001F1F3’
O = ‘\U0001F1F4’
P = ‘\U0001F1F5’
Q = ‘\U0001F1F6’
R = ‘\U0001F1F7’
S = ‘\U0001F1F8’
T = ‘\U0001F1F9’
U = ‘\U0001F1FA’
V = ‘\U0001F1FB’
W = ‘\U0001F1FC’
X = ‘\U0001F1FD’
Y = ‘\U0001F1FE’
Z = ‘\U0001F1FF’

次に出力先をファイルに変更したい。出力の確認に用いたprintf.writeに置換するのが無難だが、敢えて標準出力先をファイルに変更することで書き込むことにする。(symbol_letter.pyを生成すると仮定。)

import sys

with open("symbol_letter.py", "w") as f:
  sys.stdout = f
  for i in range(26): 
    print("{} = '\\U{:08X}'".format(chr(65 + i), 127462 + i))

この方法では先程のコードを書き換える必要がなく、sys.stdout = fをコメントアウトすれば出力を確認できる。標準出力先を戻したければsys.stdout = sys.__stdout__とすればよい。インタプリタで実行している場合は注意。

後は生成したPythonコードを読み込んで利用すれば良い。

import symbol_letter as sl

print(sl.O, sl.K)  # output: 🇴 🇰

コメント

タイトルとURLをコピーしました