2010-02-03 2 views
9

저는 Python 대화 형 셸 (Windows XP에서 ActiveState ActivePython 2.6.4)에서 작업하고 있습니다. 나는 내가 원하는 것을하는 함수를 만들었다. 그러나 화면을 지워서 함수 정의를 돌아볼 수는 없습니다. 행을 다시 표시하는 위쪽 화살표가 최소한의 값을 갖도록 여러 줄 함수이기도합니다. 어쨌든 함수의 실제 코드를 반환 할 수 있습니까? "코드"및 "func_code"속성이 dir()에 의해 표시되지만, 필요한 항목이 포함되어 있는지 여부는 알 수 없습니다.대화 형 셸에서 함수 정의 표시

+1

"help"기능을 사용하라는 제안을했지만 실제로는 서명이 아닌 실제 코드를 원한다는 것을 깨달았습니다. –

+0

나는 콘솔에서 파일로 작성한 모든 코드를 얻고 싶습니다만,받은 대답은 불가능합니다 ... 슬픈 –

답변

8

아니요, __code__func_code은 컴파일 된 바이트 코드에 대한 참조입니다. 파이썬 소스 코드로 돌아갈 수는 없습니다 (dis.dis 참조).

아아, 소스 코드는 단순히 ... 어디 기억하지, 사라 : 그것을 얻을 수 없습니다

>>> import inspect 
>>> def f(): 
... print 'ciao' 
... 
>>> inspect.getsource(f) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/inspect.py", line 694, in getsource 
    lines, lnum = getsourcelines(object) 
    File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/inspect.py", line 683, in getsourcelines 
    lines, lnum = findsource(object) 
    File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/inspect.py", line 531, in findsource 
    raise IOError('could not get source code') 
IOError: could not get source code 
>>> 

inspect 경우에, 그것은 꽤 나타내는 기호이다.

당신이 GNU readline 사용하여 플랫폼 인 경우 (기본적으로, 제외한 모든 창), 당신은 readline 자체 일부 "역사"를 기억 않고 파일에 그것을 밖으로 쓸 수 있다는 사실을 악용 할 수 ... :

>>> readline.write_history_file('/tmp/hist.txt') 

그런 다음 해당 기록 파일을 읽으십시오.

"원시"명령 인터프리터가 아니라 특히 Windows와 같은 플랫폼에서 더 나은 메모리 기능을 가진 IDE를 사용할 수 있습니다.

+0

IDE에 동의합니다.하지만 쉘은 DOS 명령 창처럼 보이고 PHB는 내가하는 일을 묻지 않습니다. –

+0

어쩌면 이것은 유휴 상태에 대한 좋은 기능 요청 일 것입니다 ... –

+0

ipython은 DOS 명령 창에서 풍부한 IDE에 도움이 될 수 있습니다. http://ipython.scipy.org/moin/ - 너무 부자입니다. 지금까지 대부분의 기능 ;-). –

0

activestate 쉘에서 수행하지 않는 한, 아니오, 쉘에서 입력 한 정확한 코드를 검색 할 수 없습니다. 적어도 Linux에서는 CPython에서 제공하는 Python 셸을 사용하여 특별한 방법이 없습니다. 아마 iPython을 사용합니다.

func_code 속성은 함수 바이트 코드를 나타내는 객체입니다.이 객체에서 얻을 수있는 유일한 것은 "원래"코드가 아니라 바이트 코드 자체입니다.

+0

리눅스에서는'readline.write_history_file'이 도움이 될 것입니다 - 그러나 Windows는 아닙니다. –

1

아니요. yourfunc.func_code.co_code (실제로 컴파일 된 바이트 코드)를 파일에 작성한 다음 decompyle 또는 unpyc을 사용하여 디 컴파일을 시도 할 수 있지만 두 프로젝트는 모두 오래되어 유지 보수가되지 않으며 디 컴파일 링을 지원하지 않습니다.

처음에는 파일에 함수를 작성하는 것이 훨씬 쉽습니다.

2

꽤 오랜 시간이 걸렸지 만 누군가 필요할 수도 있습니다.

>>> def sum(a, b, c): 
... # sum of three number 
... return a+b+c 
... 
>>> from dill.source import getsource 
>>> 
>>> getsource(sum) 
'def sum(a, b, c):\n # sum of three number\n return a+b+c\n' 

dill 실행 pip install dill를 설치 : getsource 소스 코드를 제공합니다. 형식을 얻으려면 :

>>> fun = getsource(sum).replace("\t", " ").split("\n") 
>>> for line in fun: 
... print line 
... 
def sum(a, b, c): 
# sum of three number 
return a+b+c