dictionary - Should all dict params in python decorated by asterisks -
def स्वीकार (** kwargs): पास अगर मैं परिभाषित स्वीकारा और मुझे उम्मीद है कि यह एक परम से गुजरते हुए कहा जाता है, क्या सभी डिक्ट पैरामिक्स के लिए तारांकन आवश्यक हैं? क्या होगा अगर मैं ऐसा करता हूं:
def स्वीकार (dict): pass dict = {...} स्वीकार (dict) विशेष रूप से बोलते हुए, मैं एक वर्ग के लिए एक update विधि को लागू करना चाहता हूं, जो कंटेनर के रूप में एक डिक्ट रखता है बस dict.update विधि की तरह, यह एक परोप के रूप में एक dict लेता है और कंटेनर की सामग्री को संशोधित करता है। इस विशिष्ट मामले में मुझे क्वार्ग का उपयोग करना चाहिए या नहीं?
नीचे f देखें। फ़ंक्शन f के दो मापदंड हैं, एक स्थितिबद्ध जिसे नाम और एक कीवर्ड तर्क संदेश कहा जाता है। वे फ़ंक्शन कॉल के फ्रेम में स्थानीय वेरिएबल हैं। जब आप f ("John", ** {"foo": "123", "message": "हैलो वर्ल्ड"}) , फ़ंक्शन एफ / <> कोड अनपैक को स्थानीय चर में इसकी कुंजी / मान जोड़ी में होगा। अंत में आपके पास तीन स्थानीय varaibles हैं: नाम , foo = 123 , और संदेश = हैलो वर्ल्ड ।
< P> ** kwargs का प्रयोजन, डबल एस्टेरिस्क बेझिनेवर्ड कीवर्ड तर्क के लिए है। इसके विपरीत:
def f (नाम, संदेश = कोई भी नहीं): अगर संदेश: वापसी का नाम + संदेश वापसी का नाम यहां मैं उपयोगकर्ता को बता रहा हूं कि आप कभी भी f कॉल करना चाहते हैं, तो आप एक कीवर्ड तर्क संदेश । यह एकमात्र किवर्ग है जो मैं कभी स्वीकार करता हूं और उम्मीद करता हूं कि ऐसा कोई है या नहीं। यदि आप f ("John", foo = "हैलो वर्ल्ड") कोशिश करते हैं तो आपको अनपेक्षित कीवर्ड तर्क मिलेगा। ** kwargs उपयोगी है अगर आप समय से आगे नहीं जानते हैं कि आप किन कुंजीशब्द तर्क प्राप्त करना चाहते हैं (निचले-स्तरीय फ़ंक्शंस / विधियों को प्रेषित करने के लिए बहुत सामान्य), फिर आप इसका उपयोग करते हैं। def f (नाम, संदेश = कोई नहीं, ** kwargs): यदि संदेश: वापसी का नाम + संदेश वापसी का नाम दूसरे उदाहरण में, आप f ("जॉन", "{{" foo ":" नमस्ते फ़ू "}) जबकि संदेश को छोड़कर। आप f ("John", ** {"foo": "हैलो फू", "संदेश": "हैलो संदेश"}) कर सकते हैं। । - क्या मैं इसे अनदेखा कर सकता हूं?
जैसा कि आप देख रहे हैं हाँ, आप इसे अनदेखा कर सकते हैं। f ("जॉन", ** {"foo": "हैलो फू", "संदेश": "हैलो संदेश"}) मैं अभी भी केवल संदेश का उपयोग करता हूं और अनदेखा करता हूं बाकी सब कुछ। का उपयोग न करें ** kwargs जब तक आपको इनपुट के बारे में लापरवाह होने की आवश्यकता नहीं है। - यदि मेरा इनपुट एक शब्दकोश है तो क्या होगा?
यदि आपका फ़ंक्शन केवल शब्दकोश लेता है और शब्दकोश को संशोधित करता है, तो इंडिडवाऊल कुंजी का उपयोग नहीं कर रहा है, तो बस पास करें शब्दकोश। डिक्शनरी आइटम को वैरिएबल में बनाने का कोई कारण नहीं है।
लेकिन यहां ** kwargs के दो मुख्य उपयोग हैं। मुझे एक वर्ग और मैं मक्खी पर विशेषताओं को बनाना चाहता हूं। मैं इनपुट से वर्ग गुणों को सेट करने के लिए setattr का उपयोग कर सकता हूं। वर्ग फू (ऑब्जेक्ट): def __init __ (** kwargs): कुंजी के लिए, kwargs.items में मान यदि मैं फ़ू (** {"" a ": 1," b ": 2}) सेटटटर (आत्म, कुंजी, मान) मुझे Foo.a और Foo.b अंत में मिलेगा। यह विशेष रूप से उपयोगी है जब आपको विरासत कोड से निपटना होगा। हालांकि, एक बड़ी सुरक्षा चिंता का विषय है। कल्पना कीजिए कि आप एक MongoDB उदाहरण के मालिक हैं और यह एक डेटाबेस में लिखने के लिए एक कंटेनर है। कल्पना कीजिए कि यह शब्द उपयोगकर्ता से एक अनुरोध फ़ॉर्म ऑब्जेक्ट है। उपयोगकर्ता कुछ फावड़ा कर सकता है और आप इसे डेटाबेस में सहेज सकते हैं? यह एक सुरक्षा छेद है सुनिश्चित करें कि आप पुष्टि करते हैं (लूप का उपयोग करें)।
क्वार्ग का दूसरा आम उपयोग यह है कि आप जिन समय से मैंने कवर किया है, उससे आगे की जानकारी नहीं है (यह वास्तव में पहले सामान्य उपयोग की तरह है)
Comments
Post a Comment