इस कोड पर विचार करें:

def say_hi(english: bool, name: str) -> str:
    if name != "":
        if english:
            greeting = f"Hi, {name}!"
    else:
        if english:
            greeting = "Hey there!"
    if english:
        greeting = greeting + "foo bar"
    if not english:
        greeting = "I speak only English, sorry."
    return greeting

कोड के एक ब्लॉक में स्टेटमेनेट (if english:) होने पर इस कोड को 3 बार समान न होने के लिए अनुकूलित करने का सबसे अच्छा तरीका क्या है? या, शायद एक अलग सवाल - क्या यह दोहराव है अगर स्टेटमेंट कोड पायथन पीईपी मानकों से मेल खाता है?

-3
neisor 12 जिंदा 2022, 12:27
1
यदि english गलत है, तो आप greeting के क्या होने की उम्मीद करते हैं?
 – 
khelwood
12 जिंदा 2022, 12:29
if not english: raise NameError फ़ंक्शन के शीर्ष पर, फिर चेक को हर जगह हटा दें…
 – 
deceze
12 जिंदा 2022, 12:30
इस मामले में यह महत्वपूर्ण नहीं है। उपरोक्त कोड एक उदाहरण के रूप में कार्य करता है। यह एक कोड स्निपेट नहीं है जिसका उपयोग करना चाहिए, लेकिन मेरे प्रश्न को प्रदर्शित करने के लिए केवल एक कोड स्निपेट है।
 – 
neisor
12 जिंदा 2022, 12:31
2
यह केवल बुरी तरह से संरचित तर्क है, या कम से कम अक्षमता से व्यक्त तर्क। इसके लिए आपको एक पीईपी की आवश्यकता नहीं है, और यह बहुत कुछ विशिष्ट मामले पर निर्भर करता है कि तर्क को और अधिक में कैसे व्यक्त किया जा सकता है कॉम्पैक्ट, अभी तक बनाए रखने योग्य तरीका।
 – 
deceze
12 जिंदा 2022, 12:40

6 जवाब

सबसे बढ़िया उत्तर

क्यों न केवल if कथनों के क्रम को उलट दिया जाए?

def say_hi(english: bool, name: str) -> str:
    if english:
        if name != "":
                greeting = f"Hi, {name}!"
        else:
                greeting = "Hey there!"
        greeting = greeting + "foo bar"
    else:
        greeting = "I speak only English, sorry."
    return greeting
2
matszwecja 12 जिंदा 2022, 12:33

आप ऐसा कुछ कर सकते हैं:

def say_hi(english: bool, name: str) -> str:
    if not english:
        greeting = "I speak only English, sorry."
    else:
        greeting = (f"Hi, {name}!" if name else "Hey there!") + "foo bar"
    return greeting
2
Jakob Madsen 12 जिंदा 2022, 12:37

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

मैं यहां आपके मूल कोड का उपयोग कर रहा हूं, क्योंकि यह एक अतिरिक्त महत्वपूर्ण सबक दिखाता है:

def say_hi(english: bool, name: str) -> str:
    if name != "":
        if english:
            greeting = f"Hi, {name}!"
    else:
        if english:
            greeting = "Hey there!"
    if english:
        greeting = greeting + "foo bar"
    return greeting
  1. पहचानें कि पहली if..else शाखाओं में एक ही if english चेक है, और अगर english गलत है तो दोनों कुछ नहीं करते हैं। तो आप उस चेक को उलट सकते हैं:

    if english:
        if name != "":
            greeting = f"Hi, {name}!"
        else:
            greeting = "Hey there!"
    
  2. पहचानें कि आप इस आंतरिक if..else को इनलाइन कर सकते हैं:

    if english:
        greeting = f"Hi, {name}!" if name != "" else "Hey there!"
    

    यह बहस का विषय है और आपकी व्यक्तिगत पसंद पर निर्भर करता है, लेकिन मुझे लगता है कि यह यहां लागू होता है।

  3. पहचानें कि अब आपके पास एक ही स्थिति की दो बार जाँच है:

    if english:
        greeting = f"Hi, {name}!" if name != "" else "Hey there!"
    if english:
        greeting = greeting + "foo bar"
    

    संघनित करें कि:

    if english:
        greeting = f"Hi, {name}!" if name != "" else "Hey there!"
        greeting = greeting + "foo bar"
    
  4. अब कुछ ऐसा जो केवल आपके मूल कोड में मौजूद है: पहचानें कि अब आपके फ़ंक्शन में एक बग है:

    def say_hi(english: bool, name: str) -> str:
        if english:
            greeting = f"Hi, {name}!" if name != "" else "Hey there!"
            greeting = greeting + "foo bar"
        return greeting
    

    यदि english झूठा है, तो आपका कार्य मूल रूप से कुछ नहीं करता है, और अंतिम पंक्ति पर एक NameError उत्पन्न करेगा। सरलीकृत तर्क से इसे पहचानना अब आसान हो गया है। तो, उस व्यवहार को स्पष्ट रूप से स्वीकार करने के लिए और कम कोड के साथ सटीक वही व्यवहार उत्पन्न करने के लिए, यह होगा:

    def say_hi(english: bool, name: str) -> str:
        if not english:
            raise NameError
    
        greeting = f"Hi, {name}!" if name != "" else "Hey there!"
        greeting = greeting + "foo bar"
        return greeting
    
  5. पहचानें कि आप अंतिम दो पंक्तियों को संक्षिप्त कर सकते हैं:

    def say_hi(english: bool, name: str) -> str:
        if not english:
            raise NameError
    
        greeting = f"Hi, {name}!" if name != "" else "Hey there!"
        return greeting + "foo bar"
    

    आप अंतिम दो पंक्तियों को फिर से संक्षिप्त कर सकते हैं, लेकिन मैं पठनीयता कारणों से नहीं करूंगा।

  6. पहचानें कि खाली तार झूठे हैं और अन्य सभी तार सत्य हैं, इसलिए name != "" जांच को सरल बनाएं:

    greeting = f"Hi, {name}!" if name else "Hey there!"
    

और निश्चित रूप से, raise NameError के बजाय आप कुछ अलग संदेश लौटाएंगे, जैसा कि आपके निश्चित कोड में है:

def say_hi(english: bool, name: str) -> str:
    if not english:
        return "I speak only English, sorry."

    greeting = f"Hi, {name}!" if name else "Hey there!"
    return greeting + "foo bar"

इस प्रकार हमने छह तर्क शाखाओं को डेढ़ (गाल में जीभ) में संघनित किया है।

1
deceze 12 जिंदा 2022, 13:08

मैं साथ जाऊंगा

def say_hi(english: bool, name: str) -> str:
    if name != "" and english:
        greeting = f"Hi, {name}!"
    elif name == "" and english:
        greeting = "Hey there!"
    return greeting + "foo bar" if english else /*greeting*/
0
anthino12 12 जिंदा 2022, 12:33
def say_hi(english: bool, name: str) -> str:
    if name != "":
        if english: #   return True
            greeting = f"Hi, {name}!"
    else:
        if english: # return True
            greeting = "Hey there!"
    if english: #return True
        greeting = greeting + "foo bar"
    return greeting

यही कारण है कि जब आप फ़ंक्शन को गलत के साथ कॉल करते हैं तो अंग्रेजी एक त्रुटि उत्पन्न करेगी, क्योंकि आपके द्वारा लिखे गए सभी कथन हमेशा सत्य वापस आ जाएंगे

इस ऐड से बचने के लिए अगर स्टेटमेंट इस तरह से फ्लेस होने पर हैंडल इंग्लिश को ब्लॉक कर देता है

def say_hi(english: bool, name: str) -> str:
    
    if name != "" and english:
            greeting = f"Hi, {name}! foo bar" 
    elif english:
            greeting = "Hey there!"
        
    else:
        greeting = "False" 
0
naif123321 12 जिंदा 2022, 12:55
  • तेजी से विफल। यानी तेजी से विफल होने वाले कोड को सबसे ऊपर रखें।
  • जहां संभव हो, बूलियन वैरिएबल "is" से शुरू होना चाहिए
# Without Foo bar
def say_hi_2(is_english_speaker: bool, name: str):
    if not is_english_speaker:
        return "I speak only English, sorry."

    if not name:
        return "Hey There"

    return f"Hi, {name}"

# With foo bar
def say_hi(is_english_speaker: bool, name: str):
    if not is_english_speaker:
        return "I speak only English, sorry."

    greeting_template = "{} foo bar"
    if not name:
        return greeting_template.format("Hey There")

    return greeting_template.format(f"Hi, {name}")

1
Antonio Mande 12 जिंदा 2022, 12:52