Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Pythonで書かれたマイクロサービスを2to3した

iwamot
April 14, 2022

 Pythonで書かれたマイクロサービスを2to3した

2022-04-14
みんなのPython勉強会 #80 懇親会
https://startpython.connpass.com/event/242556/

iwamot

April 14, 2022
Tweet

More Decks by iwamot

Other Decks in Technology

Transcript

  1. Pythonで書かれたマイクロサービスを

    2to3した
    2022-04-14

    みんなのPython勉強会 #80 懇親会

    https://startpython.connpass.com/event/242556/
    Takashi Iwamoto (@iwamot)

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  7. 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 ...

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    https://iwamot.github.io/

    View Slide