[python] 파이썬 함수의 소스 코드를 어떻게 얻을 수 있습니까?

아래에 정의 된 Python 함수가 있다고 가정하십시오.

def foo(arg1,arg2):
    #do something with args
    a = arg1 + arg2
    return a

를 사용하여 함수의 이름을 얻을 수 있습니다 foo.func_name. 위에서 입력 한대로 프로그래밍 방식으로 소스 코드를 얻는 방법은 무엇입니까?



답변

함수가 파일 시스템에서 사용 가능한 소스 파일에서 온 것이라면 inspect.getsource(foo)도움이 될 수 있습니다.

foo다음과 같이 정의 된 경우 :

def foo(arg1,arg2):         
    #do something with args 
    a = arg1 + arg2         
    return a  

그때:

import inspect
lines = inspect.getsource(foo)
print(lines)

보고:

def foo(arg1,arg2):         
    #do something with args 
    a = arg1 + arg2         
    return a                

그러나 함수가 문자열에서 컴파일되거나 스트림 또는 컴파일 된 파일에서 가져온 경우 소스 코드를 검색 할 수 없다고 생각합니다.


답변

모듈 검사 파이썬 객체의 소스 코드를 검색하는 방법이있다. 소스가 파일에있는 경우에만 작동합니다. 당신이 가지고 있다면 객체에서 소스를 얻을 필요가 없다고 생각합니다.


답변

dis 소스 코드를 사용할 수없는 경우 친구입니다.

>>> import dis
>>> def foo(arg1,arg2):
...     #do something with args
...     a = arg1 + arg2
...     return a
...
>>> dis.dis(foo)
  3           0 LOAD_FAST                0 (arg1)
              3 LOAD_FAST                1 (arg2)
              6 BINARY_ADD
              7 STORE_FAST               2 (a)

  4          10 LOAD_FAST                2 (a)
             13 RETURN_VALUE


답변

IPython을 사용하는 경우 “foo ??”를 입력해야합니다.

In [19]: foo??
Signature: foo(arg1, arg2)
Source:
def foo(arg1,arg2):
    #do something with args
    a = arg1 + arg2
    return a

File:      ~/Desktop/<ipython-input-18-3174e3126506>
Type:      function


답변

나는 그것이 inspect좋은 대답 이라고 일반적으로 동의하지만 통역사에 정의 된 객체의 소스 코드를 얻을 수 없다는 것에 동의하지 않습니다. dill.source.getsourcefrom 을 사용 dill하면 대화식으로 정의 된 함수 및 람다의 소스를 얻을 수 있습니다. 또한 커리에 정의 된 바운드 또는 언 바운드 클래스 메서드 및 함수에서 코드를 가져올 수 있습니다. 그러나 둘러싸는 객체의 코드가 없으면 해당 코드를 컴파일하지 못할 수 있습니다.

>>> from dill.source import getsource
>>>
>>> def add(x,y):
...   return x+y
...
>>> squared = lambda x:x**2
>>>
>>> print getsource(add)
def add(x,y):
  return x+y

>>> print getsource(squared)
squared = lambda x:x**2

>>>
>>> class Foo(object):
...   def bar(self, x):
...     return x*x+x
...
>>> f = Foo()
>>>
>>> print getsource(f.bar)
def bar(self, x):
    return x*x+x

>>> 


답변

runeh의 답변을 확장하려면 :

>>> def foo(a):
...    x = 2
...    return x + a

>>> import inspect

>>> inspect.getsource(foo)
u'def foo(a):\n    x = 2\n    return x + a\n'

print inspect.getsource(foo)
def foo(a):
   x = 2
   return x + a

편집 : @ 0sh에서 지적한 것처럼이 예제는 ipython평범하지는 않지만 작동합니다 python. 그러나 소스 파일에서 코드를 가져올 때는 두 가지 모두에 적합합니다.


답변

inspect모듈을 사용 하여 전체 소스 코드를 얻을 수 있습니다 . 모듈 getsource()에서 그 방법 을 사용해야 inspect합니다. 예를 들면 다음과 같습니다.

import inspect

def get_my_code():
    x = "abcd"
    return x

print(inspect.getsource(get_my_code))

아래 링크에서 더 많은 옵션을 확인할 수 있습니다.
파이썬 코드를 검색