PyPy\ 의 설정 처리 ================== 사용 가능한 설정 옵션이 점점 더 많아지면서, 필요한 옵션을 실제로 사용되는 곳까지 전달하는 일이 상당히 번거로워졌고, 새로운 옵션을 추가하는 일은 더욱 번거로워졌습니다. 이러한 문제를 피하기 위해 설정 관리(configuration management)가 도입되었습니다. 여기서는 필요한 모든 옵션이 설정 객체(configuration object)에 저장되며, 이 객체는 `RPython toolchain`_\ 과 표준 인터프리터 거의 모든 곳에서 사용할 수 있어서 새로운 옵션을 추가하는 일이 간단해집니다. 옵션은 트리 형태로 구성됩니다. 설정 객체는 여러 가지 방법으로 만들 수 있으며, optparse 커맨드 라인 파서를 자동으로 생성하는 기능도 지원됩니다. .. _RPython toolchain: https://rpython.readthedocs.org/ 주요 가정 --------- 설정(configuration) 객체는 진입점에서 생성되어 실제로 사용되는 곳까지 전달됩니다. 이렇게 하면 설정을 지역적으로 유지하면서도 어디서나 사용할 수 있고 일관성을 유지할 수 있습니다. 설정 값은 명령줄을 사용하여 생성됩니다. API 세부사항 ------------ 옵션 처리는 두 부분으로 나뉩니다: 어떤 옵션들이 사용 가능한지, 그 가능한 값과 기본값이 무엇인지, 그리고 그것들이 트리 구조로 어떻게 조직되는지에 대한 설명입니다. 특정하게 선택된 옵션들은 그 옵션 설명에 대한 참조를 가지는 설정(configuration) 객체로 묶입니다(따라서 설정 값이 옵션 설명을 따르도록 보장합니다). 이러한 분리는 rtyper의 타입 시스템에서 타입과 인스턴스 사이의 구분과 다소 유사합니다: 타입은 인스턴스가 어떤 종류의 필드를 갖는지 설명합니다. 옵션들은 트리 구조로 구성되어 있습니다. 모든 옵션은 이름을 가지며, 모든 옵션 그룹도 마찬가지입니다. 옵션의 전체 이름을 구성하는 부분들은 점으로 구분됩니다. 예: ``config.translation.thread``. 옵션 설명 ~~~~~~~~~ 모든 생성자는 옵션이나 옵션 그룹에 이름을 지정하고 문서화하기 위해 첫 번째 인자로 ``name``\ 과 ``doc`` 인자를 받습니다. 대부분의 생성자는 옵션의 기본값을 지정하는 ``default`` 인자를 받습니다. 이 인자가 제공되지 않으면 기본값은 ``None``\ 으로 간주됩니다. 대부분의 생성자는 명령줄 옵션이 어떤 모습이어야 하는지 지정할 수 있는 ``cmdline`` 인자도 받습니다(예: cmdline="-v --version"). ``cmdline``\ 이 지정되지 않으면 옵션의 이름과 전체 경로를 함께 사용하는 기본 cmdline 옵션이 생성됩니다. ``None``\ 이 ``cmdline``\ 으로 전달되면 명령줄 옵션이 전혀 생성되지 않습니다. 일부 옵션 타입은 한 옵션의 특정 선택이 다른 옵션의 특정 선택이 사용될 때에만 동작하도록 지정하기 위해 요구 사항(requirement)을 지정할 수 있습니다. 요구 사항(requirement)은 쌍(pair)의 목록을 사용하여 지정됩니다. 쌍의 첫 번째 요소는 설정되어야 하는 옵션의 경로를 나타내고, 두 번째 요소는 요구되는 값을 나타냅니다. ``OptionDescription`` +++++++++++++++++++++ 이 클래스는 하위 옵션(suboption)을 그룹화하는 데 사용됩니다. ``__init__(self, name, doc, children)`` ``children``\ 은 옵션 설명들의 목록이며(중첩된 네임스페이스를 위한 ``OptionDescription``\ 인스턴스도 포함합니다). ``ChoiceOption`` ++++++++++++++++ 여러 객체 중 하나를 선택하는 것을 나타냅니다. 이 옵션은 ``None`` 값을 가질 수도 있습니다. ``__init__(self, name, doc, values, default=None, requires=None, cmdline=DEFAULT)`` ``values``\ 는 옵션이 가질 수 있는 값들의 목록이고, ``requires``\ 는 값을 두 개의 요소로 이루어진 튜플들의 목록에 매핑하는 딕셔너리입니다. ``BoolOption`` ++++++++++++++ ``True``\ 와 ``False`` 사이의 선택을 나타냅니다. ``__init__(self, name, doc, default=None, requires=None, suggests=None, cmdline=DEFAULT, negation=True)`` ``default``\ 는 옵션의 기본값을 지정합니다. ``requires``\ 는 옵션이 참으로 설정되었을 때의 요구 사항을 기술하는 2요소 튜플의 리스트이고, ``suggests``\ 는 동일한 구조의 리스트이지만 여기 담긴 옵션들은 절대적으로 필요한 것이 아니라 그저 제안될 뿐입니다. 차이는 미묘합니다: 현재 옵션이 True로 설정되면, 필수 옵션과 제안 옵션 모두 설정됩니다. 다만 필수 옵션은 나중에 변경할 수 없습니다. ``negation``\ 은 부정 커맨드라인 옵션을 생성할지 여부를 지정합니다. ``IntOption`` +++++++++++++ 정수\ 의 선택지를 나타냅니다. ``__init__(self, name, doc, default=None, cmdline=DEFAULT)`` ``FloatOption`` +++++++++++++++ 부동소수점 수의 선택을 나타냅니다. ``__init__(self, name, doc, default=None, cmdline=DEFAULT)`` ``StrOption`` +++++++++++++ 문자열의 선택을 나타냅니다. ``__init__(self, name, doc, default=None, cmdline=DEFAULT)`` 설정 객체 ~~~~~~~~~ ``Config``\ 객체는 옵션에 대해 선택된 값(선택이 이루어지지 않았다면 기본값)을 저장합니다. ``Config``\ 객체는 ``OptionDescription``\ 인스턴스에 의해 기술됩니다. ``Config``\ 객체의 속성은 ``OptionDescription``\ 의 자식들의 이름입니다. 예제:: >>> from rpython.config.config import OptionDescription, Config, BoolOption >>> descr = OptionDescription("options", "", [ ... BoolOption("bool", "", default=False)]) >>> >>> config = Config(descr) >>> config.bool False >>> config.bool = True >>> config.bool True ``Config``\ 의 (유용한) 메서드에 대한 설명: ``__init__(self, descr, **overrides)``: ``descr``\ 는 설정 객체를 설명하는 ``OptionDescription``\ 의 인스턴스입니다. ``overrides``\ 는 서로 다른 기본값을 설정하는 데 사용할 수 있습니다(``override`` 메서드 참고). ``override(self, overrides)``: 기본값을 재정의합니다. 이렇게 하면 재정의된 값이 기본값으로 표시되어 값을 변경할 수 있게 됩니다(보통 값은 한 번만 변경할 수 있습니다). ``overrides``\ 는 경로 문자열을 값에 매핑하는 딕셔너리입니다. ``set(self, **kwargs)``: 옵션 설정을 위한 "do what I mean"(의도한 대로 동작하는) 인터페이스입니다. 해당 설정에서 시작하는 모든 경로를 검색하여 선택적 인자와 일치하는 항목을 찾고, 일치 결과가 모호하지 않으면 찾아낸 옵션을 설정합니다. optparse 파서(parser) 생성 ~~~~~~~~~~~~~~~~~~~~~~~~~~ optparse 파서를 생성하려면 ``to_optparse`` 함수를 사용합니다. 이 함수는 콜백을 사용하여 옵션 파서를 생성하며, 파서를 생성하는 데 사용된 설정 객체가 자동으로 업데이트되는 방식으로 동작합니다. ``to_optparse(config, useoptions=None, parser=None)``: optparse 파서를 반환합니다. ``config``\ 는 파서를 생성할 대상 설정 객체입니다. ``useoptions``\ 는 명령줄 옵션을 생성할 옵션들의 목록입니다. 이는 옵션에 대한 전체 경로들을 포함하거나, 혹은 해당 설명(description)의 모든 하위 옵션에 대해 명령줄 옵션을 생성하도록 옵션 설명 경로에 추가로 ".*"를 붙인 경로들을 포함할 수 있습니다. ``useoptions``\ 가 ``None``\ 이면 모든 하위 옵션이 명령줄 옵션으로 변환됩니다. ``parser``\ 는 기존 파서 객체일 수 있으며, ``None``\ 이 전달되면 새 객체가 생성됩니다. PyPy에서 config 객체의 사용법 ----------------------------- PyPy의 두 가지 큰 부분인 Python 인터프리터와 RPython 툴체인은 서로 다른 두 종류의 옵션 집합을 가지고 있습니다. 변환 툴체인 옵션은 모든 ``TranslationContext`` 인스턴스의 ``config`` 속성\ 에서 찾을 수 있으며, :source:`rpython/config/translationoption.py`\ 에 설명되어 있습니다. 인터프리터 옵션은 객체 공간(object space)에 마찬가지로 ``config``\ 라는 이름으로 첨부되어 있으며 :source:`pypy/config/pypyoption.py`\ 에 설명되어 있습니다. 두 옵션 집합 모두 :doc:`config/index` 섹션에 문서화되어 있습니다.