2022-04-14 みんなのPython勉強会 #80 懇親会 https://startpython.connpass.com/event/242556/
Pythonで書かれたマイクロサービスを2to3した2022-04-14みんなのPython勉強会 #80 懇親会https://startpython.connpass.com/event/242556/Takashi Iwamoto (@iwamot)
View Slide
技術的負債を解消したくて転職した昨夏、AWS Japanを辞めてENECHANGE株式会社に転職した面接時に「技術的負債の解消に取り組みたい」と明言した内定をもらえ、負債の解消がミッションのひとつとなった
Python 2のコードがあったElastic BeanstalkのDockerコンテナで動いているFlaskアプリLambdaに移行すればコストを減らせるLambdaではPython2のサポートが終わっている
Python 3に上げることにした「移行に取り組みたい」と手を挙げ、OKをもらった
テストを走らせたらfailした9%のテストケースがfailしたパフォーマンス向上のためのコード改善が原因だった
passするように直したテストケースとソースコードを修正したカバレッジは80%と高めだった
2to3というツールがあることを知った2to3 - Python 2 から 3 への自動コード変換https://docs.python.org/ja/3/library/2to3.htmlPython 3の公式Dockerイメージにも2to3が含まれている$ docker run -it --rm python:3 2to3 --help | head -1Usage: 2to3 [options] file|dir ...
2to3を実行したら、色々変換された (1)dict- dict.values()+ list(dict.values())- dict.iteritems()+ dict.items()except- except Exception, e:+ except Exception as e:
2to3を実行したら、色々変換された (2)has_key- dict.has_key(key)+ key in dictimport- import weather+ from . import weather
2to3を実行したら、色々変換された (3)imports- import ConfigParser+ import configparserprint- print 'foo'+ print('foo')
2to3を実行したら、色々変換された (4)unicode- u'foo'+ 'foo'xrange- range(1, 13)+ list(range(1, 13))
必要ない変換は元に戻したたとえばdictによる変換は不要だった- list(dict.values())+ dict.values()Python 2では dict.values() はリストを返すPython 3では dict.values() はビューオブジェクトを返すビューオブジェクトのまま処理できるなら、そのままでよい
あとは手作業で進めた依存パッケージのアップグレードテストがfailする部分の修正Lambda対応
2to3があってよかった初見から数日で移行できたこういう移行ツールが用意されていると助かる
負債に困ったらご相談くださいSpot Resourceという屋号で副業していますhttps://iwamot.github.io/