अजगर को कोष्ठक के साथ और बिना मुखर


104

यहां मुखरता के चार सरल उपाय दिए गए हैं:

>>> assert 1==2
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
AssertionError

>>> assert 1==2, "hi"
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
AssertionError: hi

>>> assert(1==2)
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
AssertionError

>>> assert(1==2, "hi")

ध्यान दें कि पिछले एक त्रुटि नहीं उठाता है। इस व्यवहार का कारण बनने वाले कोष्ठक के साथ या उसके बिना कॉल करने में क्या अंतर है? मेरा अभ्यास कोष्ठक का उपयोग करना है, लेकिन उपरोक्त सुझाव है कि मुझे नहीं करना चाहिए।


उपयोगी उत्तर के लिए धन्यवाद। कीवर्ड और अंतर्निहित कार्यों के बीच का अंतर सूक्ष्म लगता है। यहां कीवर्ड की एक सूची है, जिसके लिए मैं अनुमान लगाता हूं
पार्स को

2
एक अंतर यह है कि आप अंतर्निहित कार्यों को फिर से परिभाषित कर सकते हैं लेकिन कीवर्ड के साथ ऐसा नहीं कर सकते (ऐसा नहीं है कि पूर्व एक अच्छा विचार है)।
गफन

यह फ़ंक्शन बनाम कीवर्ड भेद नहीं है, लेकिन फ़ंक्शन कॉल बनाम स्टेटमेंट है । (उदाहरण के लिए - प्रिंट एक बयान हुआ करता था, और बिना कोष्ठक के काम करता था)।
टॉमस गैंडर

जवाबों:


129

अंतिम assertने आपको एक चेतावनी दी होगी ( SyntaxWarning: assertion is always true, perhaps remove parentheses?) यदि आप इसे पूर्ण दुभाषिया के माध्यम से चलाते हैं, तो आईडीएलई के माध्यम से नहीं। क्योंकि assertएक कीवर्ड है और एक फ़ंक्शन नहीं है, आप वास्तव में पहले तर्क के रूप में एक टपल में गुजर रहे हैं और दूसरे तर्क को छोड़ रहे हैं।

याद रखें कि गैर-खाली ट्यूपल्स मूल्यांकन करते हैं True, और चूंकि मुखर संदेश वैकल्पिक है, इसलिए आपको अनिवार्य रूप से assert Trueलिखा जाता है जब आपने लिखा था assert(1==2, "hi")


10
इसका कारण यह नहीं है assert (1==2)कि एक एकल अभिव्यक्ति के चारों ओर कोष्ठक स्वचालित रूप से एक ट्यूपल नहीं बनाएगा; यदि आपने किया तो आपको # 4 जैसा व्यवहार मिलेगा assert (1==2,)। यदि आप के print ('foo', 'bar')बजाय एक ही बात होती print 'foo', 'bar'; आपने टपल को आउटपुट में देखा होगा
माइकल मूरजेक

फॉर्म के उस बयान पर और जोर देने के लायक है assert(test, message) शायद गलत हैं, और निश्चित रूप से भ्रमित हैं। कोई परगने नहीं!
trobrobruce

19
तो, एक लंबी मुखर कथन, पीईटीपी 8 को इंडेंट करने का उचित तरीका क्या है? असंभव लगता है।
स्टैंटनकॉन्ग


30

यदि आप कोष्ठक डालते हैं क्योंकि आप एक बहु-पंक्ति अभिकारक चाहते थे, तो एक विकल्प इस तरह से पंक्ति के अंत में एक बैकस्लैश डालना है:

foo = 7
assert foo == 8, \
    "derp should be 8, it is " + str(foo)

प्रिंटों:

AssertionError: "derp should be 8, it is 7

इस अजगर assertको हर चीज से अलग क्यों होना पड़ता है:

मुझे लगता है कि पाइथोनिक विचारधारा यह है कि एक कार्यक्रम को आत्मसात करना चाहिए ताकि विशेष झंडा लगाने के बारे में चिंता न हो। जोर लगाने का प्रलोभन बहुत महान है, और इस तरह यह पदावनत हो रहा है।

मैं आपकी झुंझलाहट को साझा करता हूं कि अजगर के assertपास अन्य सभी अजगर प्रोग्रामिंग कंस्ट्रक्शन के सापेक्ष अद्वितीय सिंटैक्स है, और यह सिंटैक्स अभी तक फिर से python2 से python3 में बदल गया है और फिर से अजगर 3.4 से 3.6 में बदल गया है। मुखर बयान बनाना किसी भी संस्करण से किसी भी अन्य संस्करण के लिए संगत नहीं है।

यह कंधे पर एक नल है जो assertएक तृतीय श्रेणी का नागरिक है, इसे अजगर 4 में पूरी तरह से हटा दिया जाएगा, और निश्चित रूप से फिर से पायथन 8.1 में।


2
क्या मुखर के बजाय हमें क्या उपयोग करना चाहिए? जोर लगाने के लिए मुखर इस तरह के एक तार्किक नाम की तरह लगता है, और इसमें वांछित व्यवहार होता है, जैसे त्रुटि पर एक विशेष संदेश।
ऐनीअजील

18

assert 1==2, "hi"assert 1==2, "hi"कीवर्ड के दूसरे पैरामीटर के रूप में "hi" के साथ पार्स किया गया है। इसलिए क्यों यह ठीक से एक त्रुटि देता है।

assert(1==2)के रूप में assert (1==2)जो के समान है assert 1==2, क्योंकि वहाँ एक अनुगामी अल्पविराम जैसे एक अनुगामी अल्पविराम नहीं बनाते हैं, के रूप में पार्स किया गया है (1==2,)

assert(1==2, "hi")के रूप में पार्स किया जाता है assert (1==2, "hi"), जो एक त्रुटि नहीं देता है क्योंकि एक गैर-खाली ट्यूपल (False, "hi")एक गलत मान नहीं है, और कीवर्ड के लिए कोई दूसरा पैरामीटर नहीं है।

assertपाइथन में फ़ंक्शन नहीं होने के कारण आपको कोष्ठक का उपयोग नहीं करना चाहिए - यह एक कीवर्ड है।


13

आप \इस तरह के बिना मुखर बयान तोड़ सकते हैं :

foo = 7
assert foo == 8, (
    'derp should be 8, it is ' + str(foo))

या यदि आपके पास और भी लंबा संदेश है:

foo = 7
assert foo == 8, (
    'Lorem Ipsum is simply dummy text of the printing and typesetting '
    'industry. Lorem Ipsum has been the industry\'s standard dummy text '
    'ever since the 1500s'
)

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

1

निम्नलिखित अजगर के डॉक्टर से उद्धृत किया गया है

मुखर कथन एक प्रोग्राम में डीबगिंग अभिकथन सम्मिलित करने का एक सुविधाजनक तरीका है:

assert_stmt ::= "assert" expression ["," expression]

सरल रूप, मुखर अभिव्यक्ति, के बराबर है if __debug__: if not expression: raise AssertionError

एक्सप्रेशन 1, एक्सप्रेशन 2 , विस्तारित रूप, के बराबर है if __debug__: if not expression1: raise AssertionError(expression2)

इसलिए जब आप कोष्ठक का उपयोग कर रहे हैं, तो आप सरल रूप का उपयोग कर रहे हैं, और अभिव्यक्ति का मूल्यांकन टुपल के रूप में किया जाता है, जो कि बूल को डाले जाने पर हमेशा सही होता है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.