दिलचस्प पोस्ट
क्या मैं एक रिवर्स इटरेटर को आगे चलने वाले को बदल सकता हूँ? रीडर और इनटस्टस्ट्रीम के बीच अंतर क्या है? स्टेटिक रीडोनली बनाम कॉन्स्ट एंड्रॉइड पर सिस्टम ऐप और विशेषाधिकार वाले ऐप्स के बीच क्या फर्क है? Setup.py के साथ गैर-पायथन फ़ाइलों को शामिल करना jQuery .live () बनाम .on () गतिशील HTML को लोड करने के बाद क्लिक ईवेंट को जोड़ने के लिए विधि जावास्क्रिप्ट गुमनाम समारोह में यह मान MySQL CONVERT_TZ () एक div के भीतर फ़्लोटिंग तत्व, div के बाहर तैरता है क्यूं कर? मैक ओएस एक्स पर XAMPP अनुमतियाँ? Emacs: निर्देशिकाओं को नेविगेट करने और फाइल खोलने के लिए क्या अच्छी रणनीति है? आईफोन 5 – नई छवियों का पालन करने का क्या नामकरण कन्वेंशन है? Android Gradle अपाचे एचटीटीपी क्लाइंट मौजूद नहीं है? मुंगुआ का उपयोग करते समय प्रश्न हल हो जाता है। कन्टेनक्शन () बनाम मुंगोज़। कनेक्शन () जावा में एक ऑब्जेक्ट कब पहुंचा जा सकता है?

क्यों अजगर dict.update () ऑब्जेक्ट वापस नहीं?

मैं करने की कोशिश कर रहा हूं:

award_dict = { "url" : "http://facebook.com", "imageurl" : "http://img.hiwab.com/python/3939267074_feb9eb19b1_o.png", "count" : 1, } def award(name, count, points, desc_string, my_size, parent) : if my_size > count : a = { "name" : name, "description" : desc_string % count, "points" : points, "parent_award" : parent, } a.update(award_dict) return self.add_award(a, siteAlias, alias).award 

लेकिन अगर समारोह में वास्तव में बोझिल महसूस किया जाता है, और मैं इसके बजाय होता होगा:

  return self.add_award({ "name" : name, "description" : desc_string % count, "points" : points, "parent_award" : parent, }.update(award_dict), siteAlias, alias).award 

ऑब्जेक्ट वापस क्यों अद्यतन नहीं करता है ताकि आप चेन कर सकें?

JQuery को चेनिंग करने के लिए ऐसा करता है अजगर में यह स्वीकार्य क्यों नहीं है?

Solutions Collecting From Web of "क्यों अजगर dict.update () ऑब्जेक्ट वापस नहीं?"

पायथन मुख्यतः कमांड-क्वेरी जुदाई के व्यावहारिक रूप से टिंग्ड स्वाद को कार्यान्वित करता है: म्यूटेटर None (व्यावहारिक रूप से प्रेरित अपवादों जैसे pop 😉 के साथ) इसलिए संभवतः वे एक्सेसर्स के साथ भ्रमित नहीं हो सकते हैं (और उसी नस में, असाइनमेंट एक अभिव्यक्ति नहीं है, बयान-अभिव्यक्ति अलग वहाँ है, और आगे)।

इसका मतलब यह नहीं है कि चीजें dict(a, **award_dict) लिए बहुत सारे तरीके नहीं हैं, जब आप वास्तव में चाहते हैं, उदाहरण के लिए, dict(a, **award_dict) एक नए dict(a, **award_dict) को आप की इच्छा की तरह दिखता है। क्यों नहीं है कि अगर आप वास्तव में महसूस करते हैं कि यह महत्वपूर्ण है?

संपादित करें : बीटीडब्ल्यू, अपने विशिष्ट मामले में, किसी भी तरह से बनाने की जरूरत नहीं है, या तो:

 dict(name=name, description=desc % count, points=points, parent_award=parent, **award_dict) 

आपके एक। a.update(award_dict) रूप में बिल्कुल समान शब्दों के साथ एक ही a.update(award_dict) (जिसमें, संघर्षों के मामले में, तथ्य यह है कि award_dict में प्रविष्टियां उन लोगों को ओवरराइड award_dict हैं, जिन्हें आप स्पष्ट रूप से award_dict रहे हैं; अन्य शब्दों को, अर्थात्, स्पष्ट करने के लिए ऐसे संघर्षों को "जीत" करने वाली प्रविष्टियां, एकमात्र award_dict रूप में उत्तीर्ण करें, कीवर्ड से पहले , और ** फ़ॉर्म – dict(award_dict, name=name आदि आदि) से वंचित हो।

परिधि के द्वारा अजगर की एपीआई प्रक्रियाओं और कार्यों के बीच अंतर करती है। फ़ंक्शंस अपने मानदंडों (किसी भी लक्ष्य वस्तु सहित) के बाहर नए मानों की गणना करते हैं; प्रक्रियाएं ऑब्जेक्ट्स को संशोधित करती हैं और कुछ भी वापस नहीं करती हैं (यानी वे कोई भी नहीं लौटते हैं)। तो प्रक्रियाओं के दुष्प्रभाव होते हैं, कार्य नहीं करते हैं। अद्यतन एक प्रक्रिया है, इसलिए यह एक मान वापस नहीं करता है

ऐसा करने की प्रेरणा यह है कि अन्यथा, आपको अवांछनीय साइड इफेक्ट मिल सकते हैं। विचार करें

 bar = foo.reverse() 

अगर रिवर्स (जो सूची में जगह लेता है) भी सूची वापस करेगा, तो उपयोगकर्ता सोच सकते हैं कि रिवर्स एक नई सूची देता है जो बार को सौंपा जाता है, और यह ध्यान नहीं देता कि फ़ू भी संशोधित हो जाता है। रिवर्स रिटर्न कोई भी नहीं बनाकर, वे तुरंत पहचानते हैं कि बार उत्परिवर्तित का नतीजा नहीं है, और रिवर्स का असर कितना करीब होगा।

 >>> dict_merge = lambda a,b: a.update(b) or a >>> dict_merge({'a':1, 'b':3},{'c':5}) {'a': 1, 'c': 5, 'b': 3} 

ध्यान दें कि मर्ज किए गए शब्द को वापस करने के साथ-साथ, यह पहली पैरामीटर को जगह में संशोधित करता है तो dict_merge (ए, बी) एक को संशोधित करेगा।

या, ज़ाहिर है, आप इसे सभी इनलाइन कर सकते हैं:

 >>> (lambda a,b: a.update(b) or a)({'a':1, 'b':3},{'c':5}) {'a': 1, 'c': 5, 'b': 3} 

ऐसा नहीं है कि यह स्वीकार्य नहीं है, बल्कि यह कि इस तरह के dicts को लागू नहीं किया गया था।

यदि आप डीजेंगो के ओआरएम को देखते हैं, तो यह चेनिंग का व्यापक उपयोग करता है यह हतोत्साहित नहीं हुआ, आप भी तानाशाह से प्राप्त कर सकते हैं और केवल update करने और return self करने के लिए अद्यतन को ओवरराइड कर सकते हैं, यदि आप वास्तव में चाहते हैं

 class myDict(dict): def update(self, *args): dict.update(self, *args) return self 

टिप्पणी के लिए पर्याप्त प्रतिष्ठा शीर्ष उत्तर पर नहीं छोड़ी

@ बेर्डेक यह CPython बात नहीं लगता है PyPy मुझे "TypeError देता है: कीवर्ड स्ट्रिंग होने चाहिए"

**kwargs साथ समाधान केवल इसलिए काम करता है क्योंकि केवल विलय करने के लिए शब्दकोश स्ट्रिंग की कुंजी है

अर्थात

 >>> dict({1:2}, **{3:4}) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: keyword arguments must be strings 

बनाम

 >>> dict({1:2}, **{'3':4}) {1: 2, '3': 4} 
 import itertools dict_merge = lambda *args: dict(itertools.chain(*[d.iteritems() for d in args])) 

जैसा कि आपके प्रस्तावित समाधान के करीब था जैसा मैं मिल सकता था

 from collections import ChainMap return self.add_award(ChainMap(award_dict, { "name" : name, "description" : desc_string % count, "points" : points, "parent_award" : parent, }), siteAlias, alias).award 

सिर्फ अजगर 3.4 में यह स्वयं कोशिश कर रहा था (इसलिए फ़ैन्सी {**dict_1, **dict_2} सिंटैक्स का उपयोग करने में सक्षम नहीं था)।

मैं शब्दकोशों में गैर-स्ट्रिंग कुंजी को सक्षम करने के साथ ही साथ एक मनमानी शब्द भी प्रदान करना चाहता था

इसके अलावा, मैं एक नया शब्दकोश बनाना चाहता था, इसलिए मैंने collections.ChainMap उपयोग न करने का dict.update किया। dict.update (थोड़े कारण मैं शुरूआत में dict.update का उपयोग नहीं करना चाहता था

यहां लिखा है कि मैं क्या कर रहा हूं:

 def merge_dicts(*dicts): all_keys = set(k for d in dicts for k in d.keys()) chain_map = ChainMap(*reversed(dicts)) return {k: chain_map[k] for k in all_keys} merge_maps({'1': 1}, {'2': 2, '3': 3}, {'1': 4, '3': 5}) # {'1': 4, '3': 5, '2': 2}