2010-03-19 11 views
6

मैंने epytext को reST मार्कअप कनवर्टर लिखा है, और अब मैं अपनी पूरी लाइब्रेरी में epytext से reST प्रारूप में सभी डॉकस्ट्रिंग को कन्वर्ट करना चाहता हूं।पायथन डॉकस्ट्रिंग को बदलना

क्या मॉड्यूल में सभी डॉकस्ट्रिंग पढ़ने और प्रतिस्थापन वापस लिखने का कोई शानदार तरीका है?

ps: ast मॉड्यूल शायद?

उत्तर

0

शायद इसे सबसे पुराने तरीके से करने के लिए सबसे सरल है। आपको जाने के लिए यहां कुछ प्रारंभिक कोड दिया गया है। यह शायद खूबसूरत हो सकता है लेकिन मूल विचार देना चाहिए:

def is_docstr_bound(line): 
    return "'''" in line or '"""' in line 

# XXX: output using the same name to some other folder 
output = open('output.py', 'w') 

docstr_found = False 
docstr = list() 
with open('input.py') as f: 
    for line in f.readlines(): 
     if docstr_found: 
      if is_docstr_bound(line): 
       # XXX: do conversion now 
       # ... 

       # and write to output 
       output.write(''.join(docstr)) 

       output.write(line) 

       docstr = list() 
       docstr_found = False 
      else: 
       docstr.append(line) 
     else: 
      if is_docstr_bound(line): 
       docstr_found = True 

      output.write(line) 

output.close() 

यह सच कार्यात्मक आप इसे किसी और निर्देशिका में फ़ाइलें एक फ़ाइल खोजक और आउटपुट के साथ हुक करने की जरूरत बनाने के लिए। संदर्भ के लिए os.path मॉड्यूल देखें।

मुझे पता है कि डॉकस्ट्रिंग बाउंड चेक संभावित रूप से कमजोर है। यह शायद थोड़ा सा गोमांस (स्ट्रिप लाइन और यह जांचने के लिए एक अच्छा विचार है कि यह एक डॉकस्ट्रिंग बाध्य के साथ शुरू होता है या समाप्त होता है)।

उम्मीद है कि कुछ विचार देता है कि कैसे संभवतः आगे बढ़ना है। शायद समस्या को संभालने के लिए एक और शानदार तरीका है। :)

+0

चलना मेरी निर्देशिका संरचना और खोलने/पढ़ने/लिखने के फ़ाइलों गर्त तुच्छ है। मेरा प्रश्न है: क्या मॉड्यूल में सभी डॉकस्ट्रिंग पढ़ने और प्रतिस्थापन वापस लिखने का कोई शानदार तरीका है? यह नियमित अभिव्यक्तियों जैसे तंत्र के साथ निष्पक्ष नहीं किया जा सकता है (जैसे re.finditer ('\ "\" \ "(। *) \" \ "\"', स्रोत)), क्योंकि मैं गड़बड़ नहीं करना चाहता शेष कोड – tomaz

+2

मुझे एक समान प्रश्न मिला जो आपको दिलचस्प लगेगा। Http://stackoverflow.com/questions/768634/python-parse-a-py-file-read-the-ast-modify-it-then-write-back-the-modified देखें। –

+1

डॉकस्ट्रिंग्स को ट्रिपल-उद्धृत स्ट्रिंग्स की आवश्यकता नहीं होती है, और ट्रिपल-उद्धृत स्ट्रिंग के साथ उद्धृत सब कुछ एक डॉकस्ट्रिंग नहीं है, इसलिए यह केवल पायथन डॉकस्ट्रिंग्स के सबसेट के लिए काम करता है। – jcdyer

0

मुझे आत्मनिरीक्षण और स्रोत प्रसंस्करण के संयोजन के बारे में आश्चर्य है। यहाँ कुछ अपरीक्षित स्यूडोकोड है:

import foo #where foo is your module 

with open('foo.py',r) as f: 
    src = f.readlines() 

for pything in dir(foo): #probably better ways to do this... 
    try: 
     docstring = pything.__doc__ 
    except AttributeError: 
     #no docstring here 
     pass 

    #modify the docstring 
    new_docstring = my_format_changer(docstring) 

    #now replace it in the source 
    src = src.replace(docstring, new_docstring) 

#When done, write it out 
with open('new_foo.py','w') as fout: 
    fout.write(src) 

जाहिर है आप कोड कि मॉड्यूल वस्तुओं है कि docstrings तो यह recurse होगा की तलाश को पार करता में कुछ चतुराई डाल करने के लिए होगा, लेकिन यह आप सामान्य विचार देता है।

2

यह इस सरल उपयोग के लिए एक ओवरकिल हो सकता है, लेकिन मैं संपादन करने के लिए 2to3 की मशीनरी का उपयोग करना चाहता हूं। आपको बस एक कस्टम फिक्सर लिखने की जरूरत है। यह न अच्छी तरह से प्रलेखित है, लेकिन अजगर 3.0 करने के लिए डेवलपर की मार्गदर्शिका: अजगर 2.6 और 2 से 3 प्रवास के: More about 2to3 और Implement Custom Fixers पर्याप्त विस्तार देता है आरंभ करने के लिए ...

Epydoc एक to_rst() विधि है जो मदद कर सकता है शामिल करने के लिए लगता है आप वास्तव में डॉकस्ट्रिंग का अनुवाद करते हैं। पता नहीं है कि यह कोई अच्छा है ...

4

Pyment एक उपकरण है जो पाइथन डॉकस्ट्रिंग को परिवर्तित कर सकता है और गायब वाले कंकाल बना सकता है। यह गूगल, Epydoc (जावाडोक शैली), Numpydoc, reStructuredText (बाकी है, स्फिंक्स डिफ़ॉल्ट) docstring स्वरूपों का प्रबंधन कर सकते हैं।

यह एक फ़ाइल या फ़ोल्डर स्वीकार करता है (उप-फ़ोल्डर भी खोज रहा है)। प्रत्येक फ़ाइल के लिए, यह प्रत्येक डॉकस्ट्रिंग प्रारूप को पहचान लेगा और इसे वांछित में परिवर्तित करेगा। अंत में, फ़ाइल पर लागू करने के लिए एक पैच उत्पन्न किया जाएगा।

अपनी परियोजना बदलने के लिए:

  • Pyment स्थापित

प्रकार निम्नलिखित (एक virtualenv आप उपयोग कर सकते हैं):

$ git clone https://github.com/dadadel/pyment.git 
$ cd pyment 
$ python setup.py install 
  • Epydoc से परिवर्तित करने के लिए स्फिंक्स

आप ऐसा करके स्फिंक्स प्रारूप (बाकी), जो कि डिफ़ॉल्ट उत्पादन प्रारूप है, अपनी परियोजना में बदल सकते हैं:

$ pyment /my/folder/project 
संबंधित मुद्दे