abseil-py には DEFINE_enum_class が存在する

Jan. 3, 2023, 9:10 a.m. edited Jan. 3, 2023, 9:12 a.m.

#Python 

Python の引数処理ライブラリは docoptclick など色々あるが、 abseil-py も割と有名である(元々 Google 製のためか TensorFlow をインストールすると一緒についてくる)。

基本的な使い方はドキュメントにあるとおりだが、見てわかるように DEFINE_enum は与えられた文字列リストから選択する形式であり、 Python の enum class を用いることができない。

そのため Issue: DEFINE_enum supports Enum? #207 を立てたのだが、驚くべきことにドキュメントには存在しない DEFINE_enum_class が存在すると回答された

そこでさっそく試したところ、以下のように利用することができた。

from enum import Enum, auto
from absl import app, flags

class Color(Enum):
    RED = auto()
    GREEN = auto()

flags.DEFINE_enum_class('color', Color.RED, Color, 'set color')
FLAGS = flags.FLAGS

def main(argv_):
    if FLAGS.color == Color.RED:
        print('color is red')

if __name__ == '__main__':
    app.run(main)

実行すると、

$ python main.py --help

       USAGE: main.py [flags]
flags:

main.py:
  --color: <red|green>: set color
    (default: 'red')

Try --helpfull to get a list of all flags.
$ python main.py --color red
color is red

としっかり動作した。