absl.flag의 장점
argparse 처럼 유연하지는 않습니다. (거의 raw level api라서 argparse만큼 유연한 물건은 없습니다)
import 레벨에서만 원하는대로 동작 합니다. (우회 가능은 하나, 그 방법이 나름 복잡하여)
multi-processing의 경우, python mp 특성에 의해 부모거를 fork 해서 사용합니다.
rpc 는 안 될듯 합니다.
pip install absl-py
from absl import logging
logging.info('This is an informational log.')
logging.warning('This is a warning log.')
logging.error('This is an error log.')
from absl import flags
FLAGS = flags.FLAGS
# flags.DEFINE_integer:
# Python 스크립트에서 정수형 값을 명령행 인자나 환경 변수로부터 가져올 때 사용됩니다.
flags.DEFINE_integer('num_epochs', 10, 'Number of epochs for training.')
flags.DEFINE_float('learning_rate', 0.01, 'Learning rate for training.')
print(FLAGS.num_epochs)
print(FLAGS.learning_rate)
기존의 enum 타입을 사용할 때 사용
DEFINE_enum 함수는 기존의 enum 타입을 사용하는 경우에 사용됩니다.
이를 통해 absl.flags는 해당 enum 타입의 인스턴스를 생성하고, 해당 인스턴스를 사용하여 커맨드 라인에서 받은 값을 enum 타입으로 변환합니다.
예를 들어, 다음은 Color라는 enum 타입을 DEFINE_enum 함수를 사용하여 정의하는 예제 코드입니다.
from absl import flags
FLAGS = flags.FLAGS
# Color enum 정의
class Color(enum.Enum):
RED = 1
GREEN = 2
BLUE = 3
# Color enum 인자 등록
flags.DEFINE_enum(
name='color', default='RED', enum_values=['RED', 'GREEN', 'BLUE'],
help='The color to use.')
from absl import flags
FLAGS = flags.FLAGS
# Color enum class 정의
class Color(flags.Enum):
RED = 1
GREEN = 2
BLUE = 3
# Color enum 인자 등록
flags.DEFINE_enum_class(
name='color', default=Color.RED, enum_class=Color,
help='The color to use.')
from absl.testing import absltest
def add(x, y):
return x + y
class AddTest(absltest.TestCase):
def test_add(self):
self.assertEqual(add(1, 2), 3)
self.assertEqual(add(2, 3), 5)
if __name__ == '__main__':
absltest.main()
from absl.testing import absltest, flagsaver
FLAGS = flags.FLAGS
class MyTest(absltest.TestCase):
def test_func1(self):
FLAGS.my_flag = True
self.assertTrue(FLAGS.my_flag)
def test_func2(self):
self.assertFalse(FLAGS.my_flag)
from absl.testing import absltest, flagsaver
FLAGS = flags.FLAGS
class MyTest(absltest.TestCase):
@flagsaver.flagsaver
def test_func1(self):
FLAGS.my_flag = True
self.assertTrue(FLAGS.my_flag)
@flagsaver.flagsaver
def test_func2(self):
self.assertFalse(FLAGS.my_flag)
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--num_iterations', type=int, default=10, help='number of iterations')
args = parser.parse_args() # args: argparse.Namespace 인스턴스
print(args.num_iterations)
from absl import flags
from absl.flags import FLAGS
from absl.flags import argparse_flags
from absl.flags import flagsaver
FLAGS = flags.FLAGS
def main(argv):
# `num_iterations` 값을 100으로 설정하고, 이전 값을 저장함
with flagsaver.flagsaver():
FLAGS.num_iterations = 100
# 현재 플래그 값을 파싱하여 `argparse.Namespace` 형식으로 반환함
parsed_flags = flagsaver.as_parsed()
# `num_iterations` 값을 출력함
print(parsed_flags.num_iterations)
if __name__ == '__main__':
app.run(main)
from absl import app
def main(argv):
print('Hello, world!')
if __name__ == '__main__':
app.run(main)
from absl import app, flags
FLAGS = flags.FLAGS
flags.DEFINE_string('input_file', None, 'Input file path')
flags.DEFINE_string('output_file', None, 'Output file path')
def main(argv):
with open(FLAGS.input_file, 'r') as f:
content = f.read()
with open(FLAGS.output_file, 'w') as f:
f.write(content)
if __name__ == '__main__':
app.run(main)
python example.py --input_file=input.txt --output_file=output.txt
from absl import flags
flags_obj = flags.FlagValues()
flags_obj.DEFINE_string('input_file', None, 'Input file path')
flags_obj.DEFINE_string('output_file', None, 'Output file path')
flags_obj.FLAGS.input_file = 'input.txt'
flags_obj.FLAGS.output_file = 'output.txt'