programing

내장된 Python 함수의 소스 코드를 찾으십니까?

copyandpastes 2023. 1. 2. 23:17
반응형

내장된 Python 함수의 소스 코드를 찾으십니까?

파이썬에 내장된 함수가 어떻게 작동하는지 알 수 있는 방법이 있나요?사용방법뿐만 아니라 어떻게 만들어졌는가, 분류 또는 열거된 코드는 무엇인가 등입니다.

Python은 오픈 소스이므로 소스 코드를 읽을 수 있습니다.

특정 모듈 또는 함수가 구현되어 있는 파일을 확인하려면 일반적으로__file__기여하다.또는 를 사용할 수 있습니다.inspect모듈, "Retriving Source Code" (소스 코드 취득) 섹션을 참조하십시오.inspect.

빌트인 클래스나 메서드의 경우, 이것은 간단하지 않습니다.inspect.getfile그리고.inspect.getsource는 오브젝트가 내장되어 있음을 나타내는 유형 오류를 반환합니다.그러나 많은 기본 제공 유형은 Python 소스 트렁크의 하위 디렉터리에서 찾을 수 있습니다.예를 들어 열거 클래스의 구현에 대해서는 여기를 참조주십시오.또한 이 클래스의 구현에 대해서는 여기를 참조해 주십시오.list유형.

다음은 @Chris의 답변을 보충하기 위한 요리책 답변입니다.CPython은 GitHub로 이동했으며 Mercurial 저장소는 더 이상 업데이트되지 않습니다.

  1. 필요한 경우 Git을 설치합니다.
  2. git clone https://github.com/python/cpython.git

  3. 코드는 다음 서브디렉토리로 체크아웃됩니다.cpython->cd cpython

  4. 예를 들어 다음과 같은 정의를 찾고 있다고 합시다.print()...
  5. egrep --color=always -R 'print' | less -R
  6. 아하! 봐!Python/bltinmodule.c->builtin_print()

즐거운 시간 되세요.

여기에 이미지 설명 입력

나는 다음 것의 출처를 찾기 위해 조금 파헤쳐야 했다.Built-in Functions검색 결과 수천 개의 결과를 얻을 수 있기 때문입니다. (출처를 찾을 수 있는 검색 결과가 있으면 행운을 빌어요.)

어쨌든 이러한 모든 함수는 에 정의되어 있습니다.bltinmodule.c함수는 로 시작합니다.builtin_{functionname}

빌트인 소스: https://github.com/python/cpython/blob/master/Python/bltinmodule.c

빌트인 타입의 경우:https://github.com/python/cpython/tree/master/Objects

iPython 쉘을 사용하면 다음과 같이 간단하게 할 수 있습니다.function?에서 문서를 제공합니다. function??에 코드도 나타냅니다.그러나 이것은 순수 비단뱀 기능에만 적용됩니다.

그러면 언제든지 (c)Python의 소스 코드를 다운로드할 수 있습니다.

핵심 기능의 구현에 관심이 있는 경우 PyPy 소스를 참조하십시오.

2가지 방법,

  1. 다음을 사용하여 스니펫의 사용법을 확인할 수 있습니다.help()
  2. 이러한 모듈의 숨겨진 코드를 확인하려면inspect

1) 검사:

inpect 모듈을 사용하여 원하는 코드를 탐색합니다.메모: Import한 모듈 패키지에 대해서만 코드를 확인할 수 있습니다.

예:

  >>> import randint  
  >>> from inspect import getsource
  >>> getsource(randint) # here i am going to explore code for package called `randint`

2) 도움말():

간단하게 사용하시면 .help()명령어를 사용하여 내장 함수와 해당 코드에 대한 도움말을 볼 수 있습니다.

str는, 「-」: str() 「- 「-」라고 입력합니다.help(str)

이렇게 돌아오고

>>> help(str)
Help on class str in module __builtin__:

class str(basestring)
 |  str(object='') -> string
 |
 |  Return a nice string representation of the object.
 |  If the argument is a string, the return value is the same object.
 |
 |  Method resolution order:
 |      str
 |      basestring
 |      object
 |
 |  Methods defined here:
 |
 |  __add__(...)
 |      x.__add__(y) <==> x+y
 |
 |  __contains__(...)
 |      x.__contains__(y) <==> y in x
 |
 |  __eq__(...)
 |      x.__eq__(y) <==> x==y
 |
 |  __format__(...)
 |      S.__format__(format_spec) -> string
 |
 |      Return a formatted version of S as described by format_spec.
 |
 |  __ge__(...)
 |      x.__ge__(y) <==> x>=y
 |
 |  __getattribute__(...)
-- More  --

Python Developer Guide는 알려지지 않은 리소스입니다.

최근호 GH에서는 질문하신 질문에 대처하기 위한 새로운 장(CPython Source Code Layout)이 추가되었습니다.변경이 필요한 경우는, 그 자원도 갱신됩니다.

바로 질문으로 넘어갑시다.

내장된 Python 함수의 소스 코드를 찾으십니까?

는 '소스코드'에 .cpython/Python/bltinmodule.c

GitHub 저장소에서 소스 코드를 찾으려면 여기를 방문하십시오.내장된 모든 함수는 다음과 같이 시작됩니다.builtin_<name_of_function> , , , , , , , , , , 등입니다.sorted() 실장되어 있습니다.builtin_sorted.

고객님의 편의를 위해 이행을 게시하겠습니다.sorted():

builtin_sorted(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
{
    PyObject *newlist, *v, *seq, *callable;

    /* Keyword arguments are passed through list.sort() which will check
       them. */
    if (!_PyArg_UnpackStack(args, nargs, "sorted", 1, 1, &seq))
        return NULL;

    newlist = PySequence_List(seq);
    if (newlist == NULL)
        return NULL;

    callable = _PyObject_GetAttrId(newlist, &PyId_sort);
    if (callable == NULL) {
        Py_DECREF(newlist);
        return NULL;
    }

    assert(nargs >= 1);
    v = _PyObject_FastCallKeywords(callable, args + 1, nargs - 1, kwnames);
    Py_DECREF(callable);
    if (v == NULL) {
        Py_DECREF(newlist);
        return NULL;
    }
    Py_DECREF(v);
    return newlist;
}

눈치채셨겠지만 Python 코드가 아니라 C 코드입니다.

@Jim에서 설명한 바와 같이 파일 구성은 다음과 같습니다.재생되어 검출이 용이함:

Python 모듈의 경우 일반적인 레이아웃은 다음과 같습니다.

Lib/<module>.py
Modules/_<module>.c (if there’s also a C accelerator module)
Lib/test/test_<module>.py
Doc/library/<module>.rst

확장 전용 모듈의 경우 일반적인 레이아웃은 다음과 같습니다.

Modules/<module>module.c
Lib/test/test_<module>.py
Doc/library/<module>.rst

빌트인 타입의 경우 일반적인 레이아웃은 다음과 같습니다.

Objects/<builtin>object.c
Lib/test/test_<builtin>.py
Doc/library/stdtypes.rst

빌트인 함수의 경우 일반적인 레이아웃은 다음과 같습니다.

Python/bltinmodule.c
Lib/test/test_builtin.py
Doc/library/functions.rst

일부 예외:

builtin type int is at Objects/longobject.c
builtin type str is at Objects/unicodeobject.c
builtin module sys is at Python/sysmodule.c
builtin module marshal is at Python/marshal.c
Windows-only module winreg is at PC/winreg.c

언급URL : https://stackoverflow.com/questions/8608587/finding-the-source-code-for-built-in-python-functions

반응형