2010-10-28 9 views
5

मैं यह लागू करने के लिए एक परीक्षण कैसे स्वचालित कर सकता हूं कि पाइथन 2.x कोड के शरीर में कोई स्ट्रिंग उदाहरण नहीं है (केवल यूनिकोड उदाहरण)?पायथन 2.x: स्ट्रिंग के बजाय यूनिकोड को लागू करने के लिए स्वचालित कैसे करें?

ईजी।

क्या मैं इसे कोड के भीतर से कर सकता हूं?

क्या कोई स्थिर विश्लेषण उपकरण है जिसमें यह सुविधा है?

संपादित करें:

मैं अजगर 2.5 में एक आवेदन के लिए यह चाहता था, लेकिन यह पता चला है यह वास्तव में संभव है क्योंकि नहीं है:

  1. 2,5 unicode_literals
  2. kwargs शब्दकोश का समर्थन नहीं करता कुंजी यूनिकोड ऑब्जेक्ट्स नहीं हो सकती हैं, केवल स्ट्रिंग्स

तो मैं जवाब स्वीकार कर रहा हूं कहते हैं कि यह संभव नहीं है, भले ही यह विभिन्न कारणों से है :)

+2

'__future__ आयात से यूनिकोड_लिटरल्स –

+0

@ इग्नासिओ, वादा करता है! लेकिन क्या यह बाल्क होगा यदि कोड तीसरे पक्ष के मॉड्यूल भी आयात करता है जो इसके बारे में नहीं जानते? –

+0

नहीं, '__future__' के माध्यम से संकलक निर्देश केवल वर्तमान मॉड्यूल को प्रभावित करते हैं। –

उत्तर

1

आप लागू नहीं कर सकते कर सकते हैं कि सभी तार यूनिकोड हैं करते हैं; कमांड लाइन विकल्प: यहां तक ​​कि एक मॉड्यूल में from __future__ import unicode_literals साथ, बाइट तार वे कर सकते हैं के रूप में पायथन 3. में

वहाँ, b'...' के रूप में लिखा जा सकता है एक विकल्प है कि unicode_literals विश्व स्तर पर के रूप में ही प्रभाव प्राप्त करने के लिए इस्तेमाल किया जा सकता था -U। हालांकि इसे 2 में जल्दी छोड़ दिया गया था।एक्स श्रृंखला क्योंकि यह मूल रूप से हर लिपि तोड़ दिया।

इसके लिए आपका उद्देश्य क्या है? बाइट तारों को खत्म करना वांछनीय नहीं है। वे "खराब" नहीं हैं और यूनिकोड तार सार्वभौमिक रूप से "बेहतर" नहीं हैं; वे दो अलग जानवर हैं और आपको दोनों की आवश्यकता होगी। बाइनरी फाइलों और नेटवर्क सेवाओं से बात करने के लिए बाइट तारों की निश्चित रूप से आवश्यकता होगी।

आप अजगर 3 में संक्रमण के लिए तैयार होना चाहते हैं, सबसे अच्छा कील सभी स्ट्रिंग्स तुम सच में बाइट्स, और तार कि स्वाभाविक यूनिकोड हैं के लिए u'...' होने के लिए मतलब के लिए b'...' लिखने के लिए है। डिफ़ॉल्ट स्ट्रिंग '...' प्रारूप का उपयोग अन्य सभी चीज़ों के लिए किया जा सकता है, जहां आप परवाह नहीं करते हैं और/या क्या पाइथन 3 डिफ़ॉल्ट स्ट्रिंग प्रकार बदलता है।

+1

उद्देश्य यह है कि मैं एक बहुभाषी आवेदन लिख रहा हूं जो कि 2.5 में होना चाहिए, और मैं उन तारों पर 'यू' टाइप करना भूल जाता हूं, जिन्हें यूनिकोड की आवश्यकता नहीं होती है, लेकिन अगर वे संपादित हो जाते हैं तो ऐसा कर सकते हैं। मैं समझता हूं कि कई मामलों में नियमित तार ठीक हैं, लेकिन इस मामले में मुझे अपने इरादे को सुसंगत और स्पष्ट रूप से व्यक्त करने में मदद करने के लिए कुछ चाहिए। –

1

ऐसा लगता है कि आपको वास्तव में ईमानदारी से भलाई पाइथन पार्सर के साथ कोड को पार्स करने की आवश्यकता है। फिर आपको एएसटी के माध्यम से खोदने की आवश्यकता होगी, आपका पार्सर यह देखने के लिए उत्पादन करता है कि इसमें कोई स्ट्रिंग अक्षर है या नहीं।

ऐसा लगता है कि पाइथन बॉक्स के बाहर एक पार्सर के साथ आता है। ,

import parser 
from token import tok_name 

def checkForNonUnicode(codeString): 
    return checkForNonUnicodeHelper(parser.suite(codeString).tolist()) 

def checkForNonUnicodeHelper(lst): 
    returnValue = True 
    nodeType = lst[0] 
    if nodeType in tok_name and tok_name[nodeType] == 'STRING': 
     stringValue = lst[1] 
     if stringValue[0] != "u": # Kind of hacky. Does this always work? 
      print "%s is not unicode!" % stringValue 
      returnValue = False 

    else: 
     for subNode in [lst[n] for n in range(1, len(lst))]: 
      if isinstance(subNode, list): 
       returnValue = returnValue and checkForNonUnicodeHelper(subNode) 

    return returnValue 

print checkForNonUnicode(""" 
def foo(): 
    a = 'This should blow up!' 
""") 
print checkForNonUnicode(""" 
def bar(): 
    b = u'although this is ok.' 
""") 

जो बाहर प्रिंट

'This should blow up!' is not unicode! 
False 
True 

अब डॉक तार यूनिकोड नहीं हैं, लेकिन अनुमति दी जानी चाहिए, ताकि आप कुछ अधिक from symbol import sym_name जैसे जटिल करने के लिए हो सकता है: इस documentation से मैं इस कोड नमूना काम कर मिल गया जहां आप देख सकते हैं कि कौन से नोड प्रकार वर्ग और फ़ंक्शन परिभाषाओं के लिए हैं। फिर पहला उप-नोड जो केवल एक स्ट्रिंग है, यानी असाइनमेंट का हिस्सा नहीं है या जो भी हो, उसे यूनिकोड न होने की अनुमति दी जानी चाहिए।

अच्छा सवाल!

संपादित

बस एक अनुवर्ती टिप्पणी। आपके उद्देश्यों के लिए सुविधाजनक, parser.suite वास्तव में आपके पायथन कोड का मूल्यांकन नहीं करता है। इसका मतलब यह है कि आप इस पार्सर को अपनी पायथन फाइलों पर नामकरण या आयात त्रुटियों के बारे में चिंता किए बिना चला सकते हैं। उदाहरण के लिए, मान लीजिए कि आप myObscureUtilityFile.py कि

from ..obscure.relative.path import whatever 

शामिल आप

checkForNonUnicode(open('/whoah/softlink/myObscureUtilityFile.py').read()) 
+0

आपको कोड को पार्स करने की आवश्यकता नहीं है। सिर्फ lexemes उत्पादन पर्याप्त होना चाहिए; यदि कोई लेक्सम यूनिकोड नहीं है तो आपकी फ़ाइल परीक्षण में विफल रही है। यदि आपकी फ़ाइल में "बाहरी संदर्भ" (उदा।, से_फ्यूचर) शामिल है, तो आप * सभी * शामिल फ़ाइलों को पार्सिंग के बिना नहीं जानते हैं, लेकिन मुझे संदेह है कि यह आपकी समस्या परिभाषा का हिस्सा नहीं है। –

0

हमारे SD Source Code Search Engine (SCSE) इस परिणाम को सीधे प्रदान कर सकते हैं।

एससीएसई सटीक प्रश्नों को सक्षम करने और झूठी सकारात्मक को कम करने के लिए कुछ भाषा संरचना का उपयोग करके फ़ाइलों के बड़े सेटों में अत्यधिक तेज़ी से खोज करने का एक तरीका प्रदान करता है। यह पाइथन सहित एक ही समय में भाषाओं की विस्तृत श्रृंखला को संभालती है। एक जीयूआई एक हिट युक्त फ़ाइल से खोज हिट और वास्तविक पाठ का एक पृष्ठ दिखाता है।

यह स्रोत भाषाओं से प्रश्नों के आधार के रूप में व्याख्यात्मक जानकारी का उपयोग करता है, जिसमें विभिन्न लैंगेज कीवर्ड और पैटर्न टोकन शामिल होते हैं जो अलग-अलग सामग्री लैंगेज तत्वों से मेल खाते हैं। एससीएसई लैंगेज में उपलब्ध लेक्सम के प्रकार जानता है। कोई एक सामान्य पहचानकर्ता (क्वेरी टोकन I का उपयोग करके) या कुछ नियामक अभिव्यक्ति से मेल खाने वाले पहचानकर्ता की खोज कर सकता है। इसी प्रकार, एक जेनेरिक स्ट्रिंग ("किसी भी प्रकार की स्ट्रिंग शाब्दिक" के लिए क्वेरी टोकन "एस" का उपयोग करके) या विशिष्ट स्ट्रिंग के प्रकार (पाइथन के लिए "यूनिकोडस्ट्रिंग्स", गैर-यूनिकोड स्ट्रिंग्स इत्यादि के लिए खोज कर सकते हैं, जो सामूहिक रूप से "एस" युक्त पायथन चीजों का सेट बनाओ)।

तो एक खोज:

'for' ... I=ij* 

'के लिए' कीवर्ड पाता पास ("...") एक पहचानकर्ता जिसका उपसर्ग है "ij" और आप सभी हिट को दर्शाता है। (भाषा-विशिष्ट पंक्ति विराम और टिप्पणियाँ होती हैं खाली स्थान के अनदेखी कर रहे हैं

एक तुच्छ खोज:

S 

सभी स्ट्रिंग शाब्दिक पाता है यह अक्सर एक बहुत बड़ी सेट है: -।।}

एक खोज

UnicodeStrings 

सभी स्ट्रिंग शाब्दिक कि lexically यूनिकोड स्ट्रिंग्स के रूप में परिभाषित कर रहे हैं पाता है (यू "...")

आप जो चाहते हैं वे सभी स्ट्रिंग हैं जो यूनिकोडस्ट्रिंग्स नहीं हैं। एससीएसई एक "घटाना" ऑपरेटर प्रदान करता है जो एक प्रकार की हिट को घटा देता है जो दूसरे की हिट ओवरलैप करता है। तो अपने प्रश्न है, "क्या तार यूनिकोड नहीं हैं" संक्षेप में व्यक्त किया जाता है के रूप में:

S-UnicodeStrings 

सभी हिट दिखाया तार कि यूनिकोड तार, आपका सटीक सवाल नहीं कर रहे हैं हो जाएगा।

एससीएसई लॉगिंग सुविधाएं प्रदान करता है ताकि आप हिट रिकॉर्ड कर सकें। आप एक कमांड लाइन से एससीएसई चला सकते हैं, जो आपके उत्तर के लिए एक स्क्रिप्ट क्वेरी सक्षम कर सकता है। इसे कमांड स्क्रिप्ट में डालने से एक टूल आपके उत्तर को सीधे प्रदान करेगा।

संबंधित मुद्दे