2010-02-03 24 views
9

में फ़ंक्शन परिभाषा प्रदर्शित करें मैं पाइथन इंटरेक्टिव शैल (विंडोज XP के तहत ActiveState ActivePython 2.6.4) में काम कर रहा हूं। मैंने एक फ़ंक्शन बनाया जो मैं चाहता हूं। हालांकि, मैंने स्क्रीन को साफ़ कर दिया है, इसलिए मैं वापस नहीं जा सकता और फ़ंक्शन परिभाषा को देख सकता हूं। यह एक मल्टीलाइन फ़ंक्शन भी है ताकि लाइनों को फिर से चलाने के लिए ऊपर तीर न्यूनतम मूल्य का हो। क्या फ़ंक्शन के वास्तविक कोड को वापस करने के लिए वैसे भी है? डीआईआर() द्वारा प्रदर्शित "कोड" और "func_code" विशेषताएँ हैं, लेकिन मुझे नहीं पता कि उनमें क्या आवश्यक है या नहीं।इंटरैक्टिव खोल

+1

मैं "सहायता" फ़ंक्शन का उपयोग का सुझाव दिया था, लेकिन फिर एहसास हुआ आप समारोह में वास्तविक कोड चाहते हैं, न कि केवल यह हस्ताक्षर है। –

+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 यह करने के लिए नहीं मिल सकता है, कि एक बहुत सांकेतिक प्रवेश नहीं होता।

यदि आप जीएनयू readline का उपयोग कर एक मंच पर थे (मूल रूप से, को छोड़कर किसी भी विंडोज़), आप तथ्य यह है कि readline ही कुछ "इतिहास" याद करता है और एक फाइल करने के लिए इसे बाहर लिख सकते हैं फायदा उठाने सकता है ... :

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

और फिर उस इतिहास फ़ाइल को पढ़ें - हालांकि, मुझे विंडोज़ में ऐसा करने का कोई तरीका नहीं है।

आप "कच्चे" कमांड दुभाषिया के बजाय विशेष रूप से विंडोज जैसे प्लेटफॉर्म पर बेहतर मेमोरी क्षमताओं के साथ कुछ आईडीई का उपयोग करना चाह सकते हैं।

+0

मैं आईडीई के बारे में सहमत हूं।लेकिन खोल एक डॉस कमांड विंडो की तरह दिखता है और पीएचबी यह नहीं पूछता कि मैं क्या कर रहा हूं। –

+0

शायद यह निष्क्रिय के लिए एक अच्छा फीचर अनुरोध है ... –

+0

ipython एक डॉस कमांड विंडो पर एक समृद्ध आईडीई के लिए मदद कर सकता है, http://ipython.scipy.org/moin/ देखें - यह बहुत समृद्ध है कि मैंने ट्रैक खो दिया है अब तक इसकी अधिकांश विशेषताएं ;-)। –

0

जब तक कि सक्रियण खोल पर ऐसा करने का कोई तरीका न हो, नहीं, आपके द्वारा खोलने वाले सटीक कोड को पुनर्प्राप्त करने का कोई तरीका नहीं है। कम से कम लिनक्स पर, साइथन द्वारा प्रदान किए गए पायथन शेल का उपयोग करके इसे प्राप्त करने का कोई विशेष तरीका नहीं है। शायद iPython का उपयोग कर।

func_code विशेषता एक ऑब्जेक्ट है जो फ़ंक्शन बाइटकोड का प्रतिनिधित्व करती है, केवल एक वस्तु जो आप इस ऑब्जेक्ट से प्राप्त कर सकते हैं वह बाइटकोड है, न कि "मूल" कोड।

+0

लिनक्स पर, 'readline.write_history_file' मदद करेगा - लेकिन विंडोज़ पर नहीं। –

1

नहीं, वास्तव में नहीं। आप yourfunc.func_code.co_code (वास्तव में संकलित बाइटकोड) को एक फ़ाइल में लिख सकते हैं और फिर उन्हें डिकंपाइल करने के लिए डिकंपाइल या 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 
संबंधित मुद्दे