.. comment: this document may get out of synch with the code, but to generate it automatically we would need to use pypy to run sphinx-build ``__pypy__`` 모듈 ================= ``__pypy__``\ 모듈은 PyPy의 표준 인터프리터가 제공하는 특수 기능들의 주요 진입점입니다. 이 모듈의 내용은 :doc:`configuration options `\ 에 따라 달라지는데, 이 옵션들은 새로운 기능과 함수를 추가할 수 있으며 그 함수의 존재 여부가 해당 기능의 존재를 나타냅니다. 이는 일반적으로 CPython에서는 C로 작성되는 순수 파이썬 모듈을 작성할 때 호환성을 위해 사용됩니다. CPython에서는 사용할 수 없으므로, ``if platform.python_implementation == 'PyPy'``\ 블록 안에서 사용하거나 CPython 인터프리터로부터 숨겨야 합니다. 일반적으로 사용 가능한 기능 --------------------------- - ``internal_repr(obj)``: 객체의 인터프리터 수준 표현을 반환합니다. - ``bytebuffer(length)``: 주어진 길이의 새 읽기-쓰기 버퍼를 반환합니다. 이는 문자의 단순화된 배열처럼 동작합니다(실제로는 설정에 따라 ``array`` 모듈이 내부적으로 이를 사용합니다). - ``attach_gdb()``: 인터프리터 수준에서 GDB를 시작합니다(변환 이전이라면 PDB를 시작합니다). - ``newmemoryview(buffer, itemsize, format, shape=None, strides=None)``: ``buffer``\ 의 데이터와 지정된 itemsize, format, 그리고 선택적인 shape 및 strides를 사용하여 `memoryview` 인스턴스를 생성합니다. - ``bufferable``: 서브클래스가 오버라이드할 수 있도록 ``__buffer__(self, flags)`` 메서드를 제공하는 베이스 클래스입니다. 이 메서드는 클래스 인스턴스의 memoryview 인스턴스를 반환해야 합니다. C-API의 ``tp_as_buffer. bf_getbuffer``\ 에 의해 호출됩니다. - ``builtinify(func)``: CPython에서는 C로 구현되어 있는 것들을 앱 레벨 모듈에서 구현하기 위한 것으로, 이 데코레이터는 함수가 절대 메서드처럼 바인딩되지 않도록 보호합니다. 일부 테스트에서 클래스에 "빌트인" 함수를 넣고 인스턴스를 통해 접근하는 것과 같은 작업을 수행하기 때문에 유용합니다. - ``hidden_applevel(func)``: 앱 레벨에서 함수의 프레임을 숨기는 데코레이터입니다. - ``get_hidden_tb()``: applevel에서 숨겨진 프레임이 처리 중인 현재 예외의 트레이스백을 반환합니다. - ``lookup_special(obj, meth)``: 객체에서 특수 메서드를 조회합니다. - ``do_what_I_mean`` - ``resizelist_hint(sizehint)``\ 는 인자 리스트의 하부 저장소를 sizehint 크기로 재할당합니다. - ``newlist_hint(...)``: 길이가 sizehint인 내부 저장소를 갖는 새 빈 리스트를 생성합니다 - ``add_memory_pressure(bytes)``: 추정 바이트 수만큼 메모리 압력을 추가합니다. 내부적으로 큰 메모리 덩어리를 할당하는 C 함수를 호출할 때 유용합니다. 이는 GC가 그렇지 않았을 경우보다 더 빨리 가비지 컬렉션을 수행하도록 지시합니다. - ``newdict(type)``: 특별한 구현 전략을 사용해 일반 dict를 생성합니다. ``type``\ 은 문자열이며 다음 중 하나일 수 있습니다: * ``"module"``\ 는 ``some_module.__dict__``\ 와 동등합니다 * ``"instance"`` - 키 집합이 별로 변하지 않는 인스턴스 딕셔너리와 동등합니다 * ``"kwargs"`` - 함수에서 ``**kwargs``\ 로 얻는 것과 동등한 키워드 인자 딕셔너리로, 전달에 최적화되어 있습니다. * ``"strdict"`` - 문자열 키 전용 딕셔너리입니다. 이는 자동으로 선택되어야 합니다. - ``reversed_dict``: 딕셔너리 객체의 키를 역순으로 열거합니다. 이것은 CPython 호환성을 위해 단순히 reversed()를 호출하는 대신 ``__pypy__`` 함수로 구현되어 있습니다: PyPy에서는 딕셔너리가 순서를 가지지만 CPython 2.7에서는 그렇지 않습니다. 순서가 중요한 경우에는 collections.OrderedDict 클래스를 사용해야 합니다. 그 클래스는 __pypy__.reversed_dict()를 호출하여 ``__reversed__``\ 를 구현합니다. - ``dict_popitem_first``: ``OrderedDict.popitem(last=False)``\ 의 인터프리터 레벨 구현입니다. - ``delitem_if_value_is``\ 는 다음과 동등한 원자적 연산입니다: ``if dict.get(key) is value: del dict[key]``. 특수 용도로만 사용하십시오! 예를 들어 키가 ``int``\ 나 ``str``\ 인 경우처럼 특수화된 딕셔너리에는 사용을 피하십시오. 객체 전략으로 전환되기 때문입니다. 또한 ``is`` 연산은 실제로 포인터 동등성 비교이므로, ``value``\ 가 ``int``\ 나 ``str``\ 같은 불변 객체인 경우에는 사용을 피하십시오. - ``move_to_end``: 딕셔너리 객체의 키를 첫 번째 또는 마지막 위치로 이동시킵니다. 이는 Python 3.x에서 ``OrderedDict.move_to_end()``\ 를 구현하는 데 사용됩니다. - ``strategy(dict or list or set)``: 객체가 현재 사용 중인 기반 전략을 반환합니다. - ``list_get_physical_size(obj)``\ : 하위 리스트의 물리적 크기(즉, 초과 할당된 크기)를 반환합니다 - ``specialized_zip_2_lists`` - ``locals_to_fast`` - ``set_code_callback`` - ``save_module_content_for_future_reload`` - ``decode_long`` - ``side_effects_ok``: 역디버거(reverse-debugger)와 함께 사용하기 위한 것으로, 이 함수는 일반적으로 True를 반환하지만, watchpoint와 같은 디버깅 명령을 평가 중이면 False를 반환합니다. watchpoint를 평가할 때는 (캐싱을 포함해) 어떠한 부작용도 일으키지 않아야 할 책임이 있습니다. 이 함수는 약간의 도움을 주기 위한 것입니다---다음과 같이 작성할 수 있습니다:: if not __pypy__.side_effects_ok(): skip the caching logic getter 메서드나 프로퍼티 내부에서, 이를 watchpoint에서 사용할 수 있도록 만들기 위해. Python 코드를 변경한 후에는 ``REVDB=.. pypy``\ 를 다시 실행해야 한다는 점에 유의하십시오. - ``stack_almost_full``: 스택이 15/16 이상 찼으면 True를 반환합니다. - ``pyos_inputhook``: CPython C API에서 PyOS_InputHook()를 호출합니다 - ``get_console_cp()``: (Windows 전용) 콘솔 코드 페이지와 콘솔 출력 코드 페이지를 반환합니다. ``GetConsoleCP``\ 와 ``GetConsoleOuputCP``\ 를 호출하는 것과 동일합니다. - ``utf8content(u)``: 유니코드 문자열 u가 주어지면, 그 내부 바이트 표현을 반환합니다. 디버깅에만 유용합니다. - ``os.real_getenv(...)``\ 는 파이썬 코드를 건너뛰고 OS 환경 변수를 가져옵니다. - ``_pypydatetime``\ 는 순수 파이썬 ``datetime``\ 표준 라이브러리 모듈을 위해 올바른 C API 상호작용을 갖춘 기반 클래스를 제공합니다 빠른 문자열 연결(Concatenation) ------------------------------- 제자리 연결(``+=``) 대신, 빠르고 복사를 최소화하는 문자열 구성을 위해 이들을 사용하십시오. - ``builders.StringBuilder`` - ``builders.UnicodeBuilder`` PyPy 디버그 로그와 상호작용하기 ------------------------------- 다음 함수들은 :ref:`PYPYLOG `\ 에 사용자 정의 내용을 작성하는 데 사용할 수 있습니다. - ``debug_start(category, timestamp=False)``\ : 새 섹션을 엽니다. ``timestamp``\ 가 ``True``\ 이면, 로그에 기록된 타임스탬프도 반환합니다. - ``debug_stop(category, timestamp=False)``: ``debug_start``\ 로 연 섹션을 닫습니다. - ``debug_print(...)``: 임의의 텍스트를 로그에 출력합니다. - ``debug_print_once(category, ...)``\ : ``debug_start`` + ``debug_print`` + ``debug_stop``\ 와 동등합니다. - ``debug_flush``\ : 로그를 플러시(flush)합니다. - ``debug_read_timestamp()``: 로그에서 사용하는 것과 동일한 타이머로부터 타임스탬프를 읽습니다. - ``debug_get_timestamp_unit()``\ : ``debug_read_timestamp()``\ 가 반환하는 값의 단위를 가져옵니다. 아키텍처와 운영체제에 따라 PyPy는 타임스탬프를 읽는 방식이 다르므로, 로그 파일에서 사용되는 타임스탬프는 서로 다른 단위로 표현됩니다. ``debug_get_timestamp_unit()``\ 을 호출하여 어떤 단위인지 알 수 있으며, 다음 값 중 하나가 됩니다: ``tsc`` ``x86`` 머신에서의 기본값입니다: 타임스탬프는 `Time Stamp Counter`_\ 가 읽어들인 CPU 틱으로 표현됩니다. ``ns`` 타임스탬프는 나노초 단위로 표현됩니다. ``QueryPerformanceCounter`` Windows에서는 어떤 이유로 ``tsc``\ 를 사용할 수 없는 경우, 타임스탬프는 win API ``QueryPerformanceCounter()``\ 를 사용하여 읽습니다. 아쉽게도 ``tsc`` 틱(tick)을 나노초로 변환하는 신뢰할 만한 표준 방법은 없는 것 같습니다만, 실제로는 최신 CPU에서 틱을 CPU의 최대 공칭 주파수로 나누는 것으로 충분합니다. 이 때문에 PyPy는 원시 값을 그대로 제공하고, 변환 작업은 외부 라이브러리에 맡깁니다. .. _`Time Stamp Counter`: https://en.wikipedia.org/wiki/Time_Stamp_Counter 투명 프록시 기능 ---------------- 만약 (:config:`objspace.std.withtproxy`\ 를 통해) :ref:`투명 프록시 `\ 가 활성화되어 있다면, 다음 함수들이 ``__pypy__``\ 에 들어갑니다: - ``tproxy(typ, controller)``: typ 타입인 것처럼 보이는 무언가를 반환합니다. 그 동작은 컨트롤러(controller)에 의해 완전히 제어됩니다. 자세한 내용은 :ref:`transparent proxies `\ 를 참고하십시오. - ``get_tproxy_controller(obj)``: obj가 실제로 투명 프록시(transparent proxy)라면 해당 컨트롤러를 반환합니다. 그렇지 않으면 None을 반환합니다. 시간 측정을 위한 추가 클록 -------------------------- ``time``\ 서브모듈은 ``CLOCK_BOOTTIME``, ``CLOCK_MONOTONIC``, ``CLOCK_MONOTONIC_COARSE``, ``CLOCK_MONOTONIC_RAW`` 같은 플랫폼 종속적인 클록 타입과 두 개의 함수를 노출합니다: - ``clock_gettime(m)``\ 은 초 단위로 클록 타입의 시간을 반환하며 - ``clock_getres(m)``\ 는 초 단위로 시계 해상도를 반환합니다. 이들은 Python3.3+의 내장 ``time`` 모듈에 있으므로 PyPy3.11+에서는 ``__pypy__``\ 에서 제거되었습니다 확장 시그널 처리 ---------------- ``thread.signals_enabled``\ 은 메인이 아닌 스레드에서 사용할 컨텍스트 관리자입니다. "with" statement 안에서 시그널을 받을 수 있게 합니다. 정확히 말하면, 프로세스가 시그널을 받으면 시그널 핸들러는 (평소처럼) 메인 스레드에서 호출되거나, "with signals_enabled:" 안에 있는 다른 스레드에서 호출될 수 있습니다. 이 다른 스레드는 시그널 핸들러가 발생시킬 수 있는 예상치 못한 예외 --- 특히 KeyboardInterrupt --- 를 처리할 준비가 되어 있어야 합니다. 오버플로우\ 를 고려한 정수 연산 ------------------------------- - ``intop``\ 은 long으로 오버플로되는 대신 2의 보수(two's complement) 오버플로 동작을 갖는 정수 연산을 제공하는 모듈입니다. py.py에서 사용 가능한 기능(변환 이후에는 사용 불가) --------------------------------------------------- - ``isfake(obj)``: ``obj``\ 가 fake인 경우 True를 반환합니다.