नहीं, यह निश्चित रूप से नहीं pythonic है किया जाएगा। रास्ते में किए गए कई निर्णय विशेष रूप से इस तरह के कोडिंग को हतोत्साहित करने के लिए किए गए हैं।
if verbose:
print(stuff)
या, अगर अपने आप में कंप्यूटिंग stuff
महंगा/खतरनाक/अटल नहीं है, बस print
एक समारोह है कि जाँच करता है में लपेट:
इस लिखने के लिए सही तरीके से स्पष्ट तरीका है झंडा:
def printv(*args, **kwargs):
if verbose:
print(*args, **kwargs)
... तो आप सिर्फ इस, जिसके बारे में संक्षिप्त रूप में है के रूप में आप प्राप्त करने के लिए जा रहे हैं कर सकते हैं:
printv(stuff)
या इससे भी बेहतर, पहिया को पुनर्निर्मित करने के बजाय logging
मॉड्यूल का उपयोग करें।
लेकिन क्या होगा अगर stuff
महंगा है, और तुम सच में एक लाइन को बचाने के लिए करना चाहते हैं?
ठीक है, आपको शायद वास्तव में एक रेखा को बचाने की ज़रूरत नहीं है, और ऐसा करने से हमेशा ब्रेवटी के लिए पठनीयता को त्यागना पड़ता है; "पठनीयता गणना" the Zen of Python का एक प्रमुख हिस्सा है।लेकिन अजगर आप शर्त के रूप में एक ही लाइन पर एक पंक्ति सूट डाल करने के लिए अनुमति नहीं है:
if verbose: print(stuff)
PEP 8 के रूप में कहते हैं, "कभी कभी यह ठीक है", लेकिन यह "आम तौर पर निराश" है। चूंकि गिडो ने इसे मेलिंग सूची के विचारों पर एक ईमेल में डाल दिया, "यदि आपको एक लाइन को सहेजना है, तो 'चालाक' की बजाय कथन के एक पंक्ति का उपयोग करें। लेकिन अगर आपको एक लाइन को सहेजना है, तो शायद मैं नहीं चाहता अपना कोड पढ़ें। "
आप एक अभिव्यक्ति में इस चाहते हैं (जो आप नहीं करना चाहिए, जैसा कि मैंने नीचे बताएंगे), या आप जबकि दो टूक भावना का उल्लंघन करने के लिए पत्र तकनीकी रूप से पालन पीईपी 8 हैं:
print(stuff) if verbose else None
तो, इसके बारे में पाइथोनिक क्या नहीं है?
एक बात के लिए, आप एक अभिव्यक्ति में print
के परिणाम का उपयोग कर रहे हैं, भले ही print
कोई उपयोगी परिणाम न हो, और केवल इसके दुष्प्रभावों के लिए बुलाया जाता है। यह भ्रामक है।
और सामान्य रूप से, पाइथन के प्रति पंक्ति केवल एक तरफ प्रभाव होता है, और यह जितना संभव हो सके बाएं होता है, जिससे कोड को स्किम करना और क्या बदल रहा है यह देखना आसान हो जाता है। यह self
के बजाय None
को निष्क्रिय रूप से वापस करने के दुष्प्रभावों के साथ बयानों और अभिव्यक्तियों (और, उदाहरण के लिए, बयान असाइनमेंट) के बीच मजबूत विभाजन द्वारा मजबूत किया जाता है, और इसी तरह।
लेकिन and
और or
का उपयोग करके, उनके परिणामों के बजाए, शॉर्ट सर्किटिंग के लिए, संभावित रूप से भ्रमित करने और कम से कम कुछ लोगों के दिमाग में, बदसूरत है। यही कारण है कि टर्नरी अभिव्यक्ति (spam if eggs else beans
) जोड़ा गया था: लोगों को eggs and spam or beans
लिखने से रोकने के लिए। यह भ्रमित क्यों है? एक बात के लिए, यह वास्तव में अंग्रेजी की तरह बिल्कुल नहीं पढ़ता है, जब तक कि आप वास्तविक अंग्रेजी की तुलना में अधिक पर्ल कोड पढ़ रहे हों। दूसरे के लिए, गलती से मान्य मान का उपयोग करना बहुत आसान है जो गलत होता है; आप यह नहीं जानते हैं, और इसके लिए जांच करने के लिए, जब आप if
देखते हैं, लेकिन आप यहां नहीं हैं। यह भी ध्यान रखें कि print(stuff) if verbose else None
यह स्पष्ट करता है कि आप एक मूल्य बना रहे हैं जिसके बाद आप कुछ भी नहीं करते हैं; स्पष्ट रूप से स्पष्ट हमेशा स्पष्ट है, लेकिन विशेष रूप से जब आप कुछ असामान्य कर रहे हैं।
अंत में, प्रदर्शन के लिए के रूप में: (क) कौन परवाह करता है, और (ख) यह क्यों मापने बाईटकोड आप समझ में नहीं आता पढ़कर अनुमान करने की कोशिश नहीं की बजाय?
In [511]: quiet = True
In [512]: %timeit quiet or None
10000000 loops, best of 3: 48.2 ns per loop
In [513]: verbose=False
In [514]: %timeit if verbose: pass
10000000 loops, best of 3: 38.5 ns per loop
तो वहाँ तुम जाओ
, तेजी से पास मामले में, if
बयान वास्तव में के बारे में 20% तेजी, नहीं धीमी गति से और वे दोनों इतनी जल्दी है कि यह कभी भी अपने कार्यक्रम प्रभावित होने की संभावना है वैसे भी है । यदि आप इसे एक तंग लूप में एक अरब बार कर रहे हैं और उस प्रदर्शन को निचोड़ने की आवश्यकता है, तो आप लूप से बाकी को उठाना चाहते हैं, भले ही इसका मतलब है कि आप को दो निकट-क्लोन के साथ दोहराएं कोड (विशेष रूप से यह देखते हुए कि print
एस के बिना एक लूप कैश, आदि में फिट होने की अधिक संभावना है)।
यदि आप जानना चाहते हैं कि, क्यों, आपको उन विशेष कार्यान्वयन के विशेष संस्करण पर उन बाइटकोडों के कार्यान्वयन को देखना होगा, जिनकी आप परवाह करते हैं ... लेकिन अधिकतर, अतिरिक्त POP_TOP
करने की बजाय पिछले ऑपरेशन में विलय होने के कारण अंतर का हिस्सा है।
कृपया यह मत करें। – PaulMcG
अच्छा लगता है कि आपने पूछा :) –
यह किसी भी व्यक्ति के लिए अच्छा नहीं दिखता जो PHP प्रोग्रामर नहीं है। जहां तक एक लाइन की बचत होती है, वहां एक लाइन कमी होती है जहां आप रहते हैं? हमें अतिरिक्त मिला है। –