पर कीवर्ड तर्कों को पारित करने के लिए पाइथोनिक तरीका क्या ऐसा करने के लिए एक और अधिक पागल तरीका है?सशर्त
if authenticate:
connect(username="foo")
else:
connect(username="foo", password="bar", otherarg="zed")
पर कीवर्ड तर्कों को पारित करने के लिए पाइथोनिक तरीका क्या ऐसा करने के लिए एक और अधिक पागल तरीका है?सशर्त
if authenticate:
connect(username="foo")
else:
connect(username="foo", password="bar", otherarg="zed")
आप उन्हें इस तरह kwargs की एक सूची के लिए जोड़ सकते हैं:
connect_kwargs = dict(username="foo")
if authenticate:
connect_kwargs['password'] = "bar"
connect_kwargs['otherarg'] = "zed"
connect(**connect_kwargs)
यह कभी कभी सहायक हो सकता है आप विकल्पों में एक समारोह के लिए पारित किया जा सकता है कि एक जटिल सेट है जब। इस साधारण मामले में, मुझे लगता है कि आपके पास क्या बेहतर है, लेकिन इसे अधिक पायथनिक माना जा सकता है क्योंकि यह ओपी की तरह दो बार username="foo"
दोहराता नहीं है।
यह वैकल्पिक दृष्टिकोण भी उपयोग किया जा सकता है, हालांकि यह केवल तभी काम करता है जब आप जानते हैं कि डिफ़ॉल्ट तर्क क्या हैं। मैं डुप्लिकेट if
खंडों के कारण इसे "पायथनिक" भी नहीं मानूंगा।
password = "bar" if authenticate else None
otherarg = "zed" if authenticate else None
connect(username="foo", password=password, otherarg=otherarg)
+1 मैं इसे पोस्ट करता। –
विकल्प 1 अच्छा है, विकल्प 2 नहीं है। –
विकल्प 1 मूल प्रश्नों की तुलना में अधिक रेखाएं और कम सीधे आगे है =/ – Charlie
या, अधिक संक्षेप में:
connect(**(
{'username': 'foo', 'password': 'bar', 'otherarg': 'zed'}
if authenticate else {'username': 'foo'}
))
बस सोचा था कि मैं रिंग में मेरी टोपी फेंक चाहते हैं:
authenticate_kwargs = {'password': "bar", 'otherarg': "zed"} if authenticate else {}
connect(username="foo", **authenticate_kwargs)
ओपी के संस्करण वास्तव में इस मामले में ठीक है जहां सशर्त लोगों की संख्या की तुलना में बिना शर्त तर्कों की संख्या कम है। ऐसा इसलिए है क्योंकि अगर दोनों के निर्माण की दोनों शाखाओं में केवल बिना शर्त तर्क दोहराया जाना है। हालांकि, मैं अक्सर विपरीत मामले में चलाता हूं, यानी सशर्त लोगों की तुलना में बिना शर्त तर्कों की संख्या अधिक है।
यह मैं क्या उपयोग है:
connect(username="foo",
**(dict(password="bar", otherarg="zed") if authenticate else {}))
क्या आपके पास क्या है के साथ गलत क्या है? "अपने आप को दोहराना न करें" पालन करने का एक अच्छा नियम है, लेकिन यदि यह आपके कोड को और अधिक जटिल बनाता है। –
यह इतना जटिल नहीं होगा, इसलिए मैं इस मामले में जटिलता पर DRY मानता हूं। – ash