2014-10-30 7 views
6

क्या यह or का उपयोग करने के लिए पाइथोनिक है, इस तरह PHP कैसे or die() का उपयोग करेगा?क्या यह 'या` का उपयोग करने के लिए पाइथोनिक होगा, जैसे कि PHP' या मरने() `का उपयोग कैसे करेगा?

मैं हाल ही में
if verbose: print(stuff)
के बजाय
quiet or print(stuff)
उपयोग किया गया है।

मुझे लगता है कि यह अच्छा दिखता है, वे वही काम करते हैं, और यह एक रेखा पर बचाता है। प्रदर्शन के मामले में एक दूसरे से बेहतर होगा?

दोनों बहुत ज्यादा एक ही लग रही है मुझे करने के लिए है, लेकिन मैं वास्तव में नहीं पता है कि मैं कम से देख रहा हूँ के लिए बाईटकोड ...

or


    2   0 LOAD_FAST    0 (quiet) 
       3 JUMP_IF_TRUE_OR_POP  15 
       6 LOAD_GLOBAL    0 (print) 
       9 LOAD_CONST    1 ('foo') 
      12 CALL_FUNCTION   1 (1 positional, 0 keyword pair) 
     >> 15 POP_TOP 
      16 LOAD_CONST    0 (None) 
      19 RETURN_VALUE 

बनाम if


    2   0 LOAD_FAST    0 (verbose) 
       3 POP_JUMP_IF_FALSE  19 

    3   6 LOAD_GLOBAL    0 (print) 
       9 LOAD_CONST    1 ('bar') 
      12 CALL_FUNCTION   1 (1 positional, 0 keyword pair) 
      15 POP_TOP 
      16 JUMP_FORWARD    0 (to 19) 
     >> 19 LOAD_CONST    0 (None) 
      22 RETURN_VALUE 
+4

कृपया यह मत करें। – PaulMcG

+0

अच्छा लगता है कि आपने पूछा :) –

+0

यह किसी भी व्यक्ति के लिए अच्छा नहीं दिखता जो PHP प्रोग्रामर नहीं है। जहां तक ​​एक लाइन की बचत होती है, वहां एक लाइन कमी होती है जहां आप रहते हैं? हमें अतिरिक्त मिला है। –

उत्तर

18

नहीं, यह निश्चित रूप से नहीं 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 करने की बजाय पिछले ऑपरेशन में विलय होने के कारण अंतर का हिस्सा है।

+1

'अगर वर्बोज़: प्रिंट (सामान) 'इतना पाइथनिक नहीं है, तो पीईपी 8 – ErlVolton

+0

@ एआरएलवॉल्टन की जांच करें: यह प्रश्न क्या कर रहा है उससे कहीं अधिक _more_ पायथनिक है। – abarnert

+0

नहीं, यह नहीं है !! यह उनके उदाहरण – ErlVolton

3

मुझे नहीं लगता कि यह पाइथोनिक है। ("स्पष्ट अंतर्निहित से बेहतर है")।

आप लिख सकते हैं

if verbose: print(stuff) 

इसलिए यदि आप सख्त रखने के लिए अपनी लाइन उलटी गिनती, आप कर सकते हैं की जरूरत है।

सबसे pythonic तरीका ("पठनीयता मायने रखता है।") अभी भी उपयोग करने के लिए

if verbose: 
    print(stuff) 
+0

मुझे यकीन नहीं है कि यह कम से कम सीधे "स्पष्ट से स्पष्ट है" के अंतर्गत आता है। लेकिन यह निश्चित रूप से "पठनीयता गणना" के तहत आता है! (मैं सोचने की कोशिश कर रहा था कि जेन के कौन से हिस्सों को संदर्भित किया गया है, और मुझे सबसे स्पष्ट याद आया। :)) – abarnert

+1

@ बार्नर्ट: हां, पठनीयता यहां एक बड़ी भूमिका निभाती है। "निहित" से मैं पाइथन की (संभावित रूप से गैर-स्पष्ट) डिज़ाइन पसंद का जिक्र कर रहा था ताकि केवल एक अभिव्यक्ति का मूल्यांकन किया जा सके यदि बूलियन की स्थिति पहले ही पूरी नहीं हुई है। लोग सोच सकते हैं कि क्यों प्रिंट() 'हमेशा नहीं कहा जाता है अगर उन्हें इस सुविधा के बारे में पता नहीं है। –

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

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