수색…


함수의 바이트 코드 표시

파이썬 인터프리터는 파이썬의 가상 머신에서 코드를 실행하기 전에 코드를 바이트 코드로 컴파일합니다 ( 파이썬 바이트 코드 란?

파이썬 함수의 바이트 코드를 보는 방법은 다음과 같습니다.

import dis

def fib(n):
    if n <= 2: return 1
    return fib(n-1) + fib(n-2)

# Display the disassembled bytecode of the function.
dis.dis(fib)

dis 모듈의 dis.dis 함수는 전달 된 함수의 디 컴파일 된 바이트 코드를 반환합니다.

함수의 코드 객체 탐색하기

CPython은 함수 객체에 대한 코드 객체에 대한 액세스를 허용합니다.

__code__ 객체는 함수의 원시 바이트 코드 ( co_code )와 상수 및 변수 이름과 같은 기타 정보를 포함합니다.

def fib(n):
    if n <= 2: return 1
    return fib(n-1) + fib(n-2)
dir(fib.__code__)

def fib(n):
    if n <= 2: return 1
    return fib(n-1) + fib(n-2)
dir(fib.__code__)

객체의 소스 코드 표시

내장되지 않은 개체

파이썬 객체의 소스 코드를 인쇄하려면 inspect 사용하십시오. 이것은 내장 객체 나 대화식으로 정의 된 객체에서는 작동하지 않습니다. 이 경우 나중에 설명 할 다른 방법이 필요합니다.

다음은 random 모듈에서 메소드 randint 의 소스 코드를 인쇄하는 방법입니다.

import random
import inspect

print(inspect.getsource(random.randint)) 
# Output:
#    def randint(self, a, b):
#        """Return random integer in range [a, b], including both end points.
#        """
#
#        return self.randrange(a, b+1)

설명서 문자열을 인쇄하려면

print(inspect.getdoc(random.randint))
# Output:
# Return random integer in range [a, b], including both end points.

random.randint 메소드가 정의 된 파일의 전체 경로를 출력하십시오.

print(inspect.getfile(random.randint))
# c:\Python35\lib\random.py
print(random.randint.__code__.co_filename) # equivalent to the above
# c:\Python35\lib\random.py

대화식으로 정의 된 객체

객체가 대화식으로 정의 된 경우 inspect 는 소스 코드를 제공 할 수 dill.source.getsource 대신 dill.source.getsource 를 사용할 수 있습니다

# define a new function in the interactive shell
def add(a, b):
   return a + b
print(add.__code__.co_filename) # Output: <stdin> 

import dill
print dill.source.getsource(add)
# def add(a, b):
      return a + b

내장 객체

파이썬 내장 함수의 소스 코드는 c 로 작성되었으며 Python의 소스 코드 ( Mercurial에서 호스팅되거나 https://www.python.org/downloads/source/ 에서 다운로드 가능)를 통해서만 액세스 할 수 있습니다.

print(inspect.getsource(sorted)) # raises a TypeError
type(sorted) # <class 'builtin_function_or_method'>


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow