2017-06-22 16 views
5

अजगर में बनाता है, छोड़ने के इस तरह पीछे अल्पविराम है, ज़ाहिर है, नहीं एक SyntaxError:अनैच्छिक अनुगामी अल्पविराम है कि एक टपल

In [1]: x = 1 , 

In [2]: x 
Out[2]: (1,) 

In [3]: type(x) 
Out[3]: tuple 

लेकिन, एक ही समय में, अनुगामी अल्पविराम गलती से डाल दिया गया था, तो, इस तरह की "समस्या" को पकड़ना मुश्किल हो सकता है, खासकर पाइथन नवागंतुकों के लिए।

मैं सोच रहा हूँ अगर हम कर सकते हैं पकड़ एक "समस्या" इस तरह की जल्दी, स्थिर, PyCharm स्मार्ट कोड गुणवत्ता नियंत्रण सुविधाओं की मदद से; mypy, pylint या flake8 स्थिर कोड विश्लेषण उपकरण।

या, एक और विचार को एक आइटम टुपल्स को बिना किसी ब्रांड्स को के बिना प्रतिबंधित/हाइलाइट करना होगा। क्या यह संभव है?

+0

@onlynone Btw, मुझे यकीन है कि आप पहले प्रश्न/बयान से क्या मतलब नहीं कर रहा हूँ:

उदाहरण के लिए, यहाँ मेरी tuple.py है। क्या मुझे एक और रखना चाहिए "क्या यह संभव है?" प्रश्न के पहले भाग में? मुझे लगता है कि मेरा मतलब यह स्पष्ट है कि मेरा क्या मतलब था, लेकिन अगर मुझे कुछ भी है जो सवाल क्लीनर बनाने के लिए बेहतर किया जा सकता है तो मुझे बताएं। धन्यवाद। – alecxe

+1

मुझे लगता है कि यह ठीक है। यह सिर्फ विचित्र रूप से phrased था: "क्या यह संभव है (स्थिर कोड विश्लेषण के साथ इस मुद्दे का पता लगाने के लिए)" एक स्पष्ट "हाँ!" है - यह वही है जो स्थैतिक कोड विश्लेषण उपकरण करते हैं। और यह पाइथन के लिए सबसे लोकप्रिय लोगों में से एक को बदलता है, और जिसे आप स्वयं का जिक्र करते हैं, वह वही करता है जो आप चाहते हैं। दूसरी व्याख्या, "क्या यह संभव है (माता-पिता के बिना एक आइटम टुपल्स को प्रतिबंधित करना प्रतिबंधित है)", यह एक स्पष्ट "नहीं" प्रतीत होता है क्योंकि यह सिर्फ पाइथन काम करता है। – onlynone

+1

पीईपी 8 असामान्य रूप से अस्पष्ट है जो पिछली कॉमा के इस उपयोग को "ठीक है, लेकिन भ्रमित करने के रूप में वर्णित करता है:" मैं अधिक आधिकारिक मार्गदर्शन की अपेक्षा करता हूं https://www.python.org/dev/peps/pep-0008/#when-to-use- पीछे-अल्पविराम –

उत्तर

11

pylint पहले से ही इसे एक समस्या के रूप में पहचानता है (as of version 1.7)।

"""Module docstring to satisfy pylint""" 

def main(): 
    """The main function""" 
    thing = 1, 
    print(type(thing)) 

if __name__ == "__main__": 
    main() 
$ pylint tuple.py 
No config file found, using default configuration 
************* Module tuple 
R: 5, 0: Disallow trailing comma tuple (trailing-comma-tuple) 

------------------------------------------------------------------ 
Your code has been rated at 8.00/10 (previous run: 8.00/10, +0.00) 

$ pylint --help-msg trailing-comma-tuple 
No config file found, using default configuration 
:trailing-comma-tuple (R1707): *Disallow trailing comma tuple* 
    In Python, a tuple is actually created by the comma symbol, not by the 
    parentheses. Unfortunately, one can actually create a tuple by misplacing a 
    trailing comma, which can lead to potential weird bugs in your code. You 
    should always use parentheses explicitly for creating a tuple. This message 
    belongs to the refactoring checker. It can't be emitted when using Python < 
    3.0. 
0

यह एक अनपेक्षित व्यवहार नहीं है क्योंकि ट्यूपल ऑपरेटर , है, () नहीं। यहां कोष्ठक की भूमिका अंकगणितीय अभिव्यक्तियों की तरह ही है। तो आप पाइथन दुभाषिया में ऐसी सृजन को सीमित नहीं कर सकते हैं, अन्यथा यह कुछ अन्य भाषा होगी।

मैं मानता हूं कि पिछली कॉमा कभी-कभी अनजान होती है। pylint जैसे लिंट टूल अक्सर सामान्य प्रकार के अनुमान के माध्यम से ऐसी त्रुटियों को पकड़ने में सक्षम होते हैं (यानी वे देखते हैं कि आप किसी संख्या में टुपल जोड़ने का प्रयास करते हैं)। (यह भी ध्यान रखें कि कभी-कभी पीछे आने वाले अल्पविराम उपयोगी और कम अनजान होते हैं, उदाहरण के लिए the_only_elem, = our_list में।) दूसरा विकल्प आपको अपना सरल लिटर लिखना है जो line.rstrip().endswith(',') and '=' in line (दूसरी जांच बहु-पंक्ति सूची घोषणा को कुछ हद तक अनुमति देने के लिए) की जांच करता है।

+0

आपका लिटर चेकर बहुत कम झूठे सकारात्मक (कम से कम मेरे कोड में) उत्पन्न करेगा: 'data = func (param1, \ n param2 ...)' – MariusSiuram

+0

@ मैरियससिअराम, उत्तर में मेरा कोई "लिटर चेकर" नहीं है, बस एक चित्रण। मैंने उल्लेख किया कि यह निर्दोष नहीं है। –

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