クラスのメンバ等で類似したコードを記述する場合、単調に全部書くのは面倒に感じる。また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’
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’
次に出力先をファイルに変更したい。出力の確認に用いたprint
をf.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: 🇴 🇰
コメント