Slide 1

Slide 1 text

Pythonで書かれたマイクロサービスを 2to3した 2022-04-14 みんなのPython勉強会 #80 懇親会 https://startpython.connpass.com/event/242556/ Takashi Iwamoto (@iwamot)

Slide 2

Slide 2 text

技術的負債を解消したくて転職した 昨夏、AWS Japanを辞めてENECHANGE株式会社に転職した 面接時に「技術的負債の解消に取り組みたい」と明言した 内定をもらえ、負債の解消がミッションのひとつとなった

Slide 3

Slide 3 text

Python 2のコードがあった Elastic BeanstalkのDockerコンテナで動いているFlaskアプリ Lambdaに移行すればコストを減らせる LambdaではPython2のサポートが終わっている

Slide 4

Slide 4 text

Python 3に上げることにした 「移行に取り組みたい」と手を挙げ、OKをもらった

Slide 5

Slide 5 text

テストを走らせたらfailした 9%のテストケースがfailした パフォーマンス向上のためのコード改善が原因だった

Slide 6

Slide 6 text

passするように直した テストケースとソースコードを修正した カバレッジは80%と高めだった

Slide 7

Slide 7 text

2to3というツールがあることを知った 2to3 - Python 2 から 3 への自動コード変換 https://docs.python.org/ja/3/library/2to3.html Python 3の公式Dockerイメージにも2to3が含まれている $ docker run -it --rm python:3 2to3 --help | head -1 Usage: 2to3 [options] file|dir ...

Slide 8

Slide 8 text

2to3を実行したら、色々変換された (1) dict - dict.values() + list(dict.values()) - dict.iteritems() + dict.items() except - except Exception, e: + except Exception as e:

Slide 9

Slide 9 text

2to3を実行したら、色々変換された (2) has_key - dict.has_key(key) + key in dict import - import weather + from . import weather

Slide 10

Slide 10 text

2to3を実行したら、色々変換された (3) imports - import ConfigParser + import configparser print - print 'foo' + print('foo')

Slide 11

Slide 11 text

2to3を実行したら、色々変換された (4) unicode - u'foo' + 'foo' xrange - range(1, 13) + list(range(1, 13))

Slide 12

Slide 12 text

必要ない変換は元に戻した たとえばdictによる変換は不要だった - list(dict.values()) + dict.values() Python 2では dict.values() はリストを返す Python 3では dict.values() はビューオブジェクトを返す ビューオブジェクトのまま処理できるなら、そのままでよい

Slide 13

Slide 13 text

あとは手作業で進めた 依存パッケージのアップグレード テストがfailする部分の修正 Lambda対応

Slide 14

Slide 14 text

2to3があってよかった 初見から数日で移行できた こういう移行ツールが用意されていると助かる

Slide 15

Slide 15 text

負債に困ったらご相談ください Spot Resourceという屋号で副業しています https://iwamot.github.io/