2011-12-31 25 views
9

पर कीवर्ड तर्कों को पारित करने के लिए पाइथोनिक तरीका क्या ऐसा करने के लिए एक और अधिक पागल तरीका है?सशर्त

if authenticate: 
    connect(username="foo") 
else: 
    connect(username="foo", password="bar", otherarg="zed") 
+0

क्या आपके पास क्या है के साथ गलत क्या है? "अपने आप को दोहराना न करें" पालन करने का एक अच्छा नियम है, लेकिन यदि यह आपके कोड को और अधिक जटिल बनाता है। –

+0

यह इतना जटिल नहीं होगा, इसलिए मैं इस मामले में जटिलता पर DRY मानता हूं। – ash

उत्तर

16
  1. आप उन्हें इस तरह kwargs की एक सूची के लिए जोड़ सकते हैं:

    connect_kwargs = dict(username="foo") 
    if authenticate: 
        connect_kwargs['password'] = "bar" 
        connect_kwargs['otherarg'] = "zed" 
    connect(**connect_kwargs) 
    

    यह कभी कभी सहायक हो सकता है आप विकल्पों में एक समारोह के लिए पारित किया जा सकता है कि एक जटिल सेट है जब। इस साधारण मामले में, मुझे लगता है कि आपके पास क्या बेहतर है, लेकिन इसे अधिक पायथनिक माना जा सकता है क्योंकि यह ओपी की तरह दो बार username="foo" दोहराता नहीं है।

  2. यह वैकल्पिक दृष्टिकोण भी उपयोग किया जा सकता है, हालांकि यह केवल तभी काम करता है जब आप जानते हैं कि डिफ़ॉल्ट तर्क क्या हैं। मैं डुप्लिकेट if खंडों के कारण इसे "पायथनिक" भी नहीं मानूंगा।

    password = "bar" if authenticate else None 
    otherarg = "zed" if authenticate else None 
    connect(username="foo", password=password, otherarg=otherarg) 
    
+0

+1 मैं इसे पोस्ट करता। –

+2

विकल्प 1 अच्छा है, विकल्प 2 नहीं है। –

+0

विकल्प 1 मूल प्रश्नों की तुलना में अधिक रेखाएं और कम सीधे आगे है =/ – Charlie

-2

या, अधिक संक्षेप में:

connect(**(
    {'username': 'foo', 'password': 'bar', 'otherarg': 'zed'} 
    if authenticate else {'username': 'foo'} 
)) 
+1

यह और संक्षिप्त कैसे है? – jterrace

+0

यह एक एकल अभिव्यक्ति है जो पास करने के लिए तर्क जमा करने के लिए अस्थायी संदर्भों से दोहराती है। –

+0

मेरा मूल के संबंध में था। यह ओपी के समान ही बात है, बस पुन: व्यवस्थित है। – jterrace

0

बस सोचा था कि मैं रिंग में मेरी टोपी फेंक चाहते हैं:

authenticate_kwargs = {'password': "bar", 'otherarg': "zed"} if authenticate else {} 
connect(username="foo", **authenticate_kwargs) 
2

ओपी के संस्करण वास्तव में इस मामले में ठीक है जहां सशर्त लोगों की संख्या की तुलना में बिना शर्त तर्कों की संख्या कम है। ऐसा इसलिए है क्योंकि अगर दोनों के निर्माण की दोनों शाखाओं में केवल बिना शर्त तर्क दोहराया जाना है। हालांकि, मैं अक्सर विपरीत मामले में चलाता हूं, यानी सशर्त लोगों की तुलना में बिना शर्त तर्कों की संख्या अधिक है।

यह मैं क्या उपयोग है:

connect(username="foo", 
     **(dict(password="bar", otherarg="zed") if authenticate else {}))