2011-09-07 9 views
27

मैं पाइथन के लिए नया आरओआर प्रोग्रामर हूं। मैं वाक्यविन्यास खोजने की कोशिश कर रहा हूं जो मुझे एक चर को एक विशिष्ट मान पर सेट करने की अनुमति देगा, अगर इसे पहले निर्दिष्ट नहीं किया गया था। असल में मैं चाहता हूँ:पायथन: अगर कोई भी मौजूद नहीं है तो 0 असाइन करें

# only if var1 has not been previously assigned

var1 = 4

+6

किस परिस्थिति में आप चर का संदर्भ दे रहे हैं जो मौजूद नहीं हो सकता है? क्या आप उन चरों का संदर्भ देना चाहते हैं जिन्हें घोषित किया गया है लेकिन अभी तक प्रारंभ नहीं किया गया है? – mwcz

उत्तर

18

यह प्रोग्रामिंग का एक बहुत अलग शैली है, लेकिन मैं हमेशा चीजें हैं जो सिर्फ में

bar = None 
if foo(): 
    bar = "Baz" 

if bar is None: 
    bar = "Quux" 

की तरह दिखाई देता पुनर्लेखन के लिए प्रयास करें:

if foo(): 
    bar = "Baz" 
else: 
    bar = "Quux" 

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

+37

यह भी का उपयोग कर 'बार =" बाज "एक एक लाइनर में छोटा किया जा सकता है अगर foo() और" Quux "' – MatToufoutu

+0

@grokpot: कि कुछ भी परिवर्तन नहीं होना चाहिए, दोनों कोड के टुकड़े या एक ही बातों के लिए ले जाया नहीं किया जाना चाहिए 'foo() द्वारा दिया' – SingleNegationElimination

+0

@grokpot: दो स्निपेट ध्यान से पढ़ें, यह परीक्षण नहीं कर रहा है और यदि 'foo()' 'लौटे None', यह परीक्षण अगर' bar' अब भी है 'None'। आप 'foo() की एक परिभाषा की आपूर्ति कर सकते हैं' कि दो स्निपेट विभिन्न कार्य 'bar' देने के लिए कारण होगा, मैं तुम्हें स्कॉच की एक फैंसी बोतल खरीद करेंगे (या जो भी आप पसंद करते हैं) – SingleNegationElimination

56

आप को कोई नहीं पर चर को प्रारंभ करना चाहिए और फिर इसे की जाँच करें:

var1 = None 
if var1 is None: 
    var1 = 4 

कौन सा रूप में एक पंक्ति में लिखा जा सकता है:

var1 = 4 if var1 is None else var1 

या शॉर्टकट का उपयोग (लेकिन इसके खिलाफ जांच कोई भी सिफारिश की है)

var1 = var1 or 4 

वैकल्पिक रूप से अगर आप कुछ भी चर करने के लिए सौंपा है कि चर नाम मौजूद नहीं है और इसलिए है कि बाद का उपयोग कर NameError बढ़ा देंगे की जरूरत नहीं होगी, और तुम भी है कि ज्ञान का उपयोग कर सकते

की तरह कुछ करने के लिए
try: 
    var1 
except NameError: 
    var1 = 4 

लेकिन मैं इसके खिलाफ सलाह दूंगा।

+0

ध्यान दें कि यदि आप एक मान देना चाहते हैं, तो आप या तो एक 'global' /' nonlocal' घोषणा की जरूरत है या UnboundLocalError' को छोड़कर का उपयोग '(और स्वीकार करते हैं कि चर स्थानीय हो जाएगा और एक विश्व स्तर पर निर्धारित मूल्य नजरअंदाज कर दिया जाएगा।) – delnan

+0

@ डेलनान जहां मेरे उदाहरण में मुझे UnboundLocalError मिलेगा? –

+2

बाद में असाइनमेंट के कारण ('छोड़कर' में), 'var1' एक स्थानीय चर है जब तक स्निपेट मॉड्यूल (यानी, वैश्विक) स्तर पर नहीं है या एक पंक्ति' वैश्विक var1' है। एक गैर-अभी तक असाइन किए गए स्थानीय चर को एक्सेस करने से 'NameError' (जो वैश्विक नामों के लिए आरक्षित है) के बजाय 'अनबाउंडलोकलरर' बढ़ाता है। – delnan

0

तुम्हारा मतलब मॉड्यूल स्तर पर एक चर तो आप "वैश्विक" का उपयोग कर सकते हैं:

if "var1" not in globals(): 
    var1 = 4 

लेकिन आम अजगर मुहावरा यह प्रारंभ करने में None (यह मानते हुए कि यह एक स्वीकार्य मूल्य नहीं है) कहने के लिए है और फिर if var1 is not None के साथ परीक्षण।

+7

इस तरह पागलपन निहित है। यह ग्लोबल्स पर 'स्थानीय()' ब्रेक का उपयोग करके स्थानीय चर पर टूट जाता है, और मुझे नहीं लगता कि या तो नॉनोकोकल्स के साथ काम करता है। इसे ठीक करने के लिए, किसी को पूरे स्कोपिंग नियमों का अनुकरण करना होगा या दोनों को मानते हुए कोड लिखना होगा। – delnan

+2

@delnan: के बारे में स्थानीय/nonglobal इस मैं "आप मॉड्यूल स्तर पर एक चर मतलब तो" के साथ क्या मतलब है। उस बेवकूफ के बारे में "इस तरह पागलपन है" आपको ओपी को बताना चाहिए, मुझे नहीं ... जवाब में जिस तरह से वास्तव में बताया गया है कि यह नहीं किया जाना चाहिए कि चीजें कैसे की जानी चाहिए। – 6502

15
var1 = var1 or 4 

केवल मुद्दा यह हो सकता है यह है कि अगर var1 एक falsey मूल्य, झूठे या 0 या [], यह 4 के बजाय का चयन करेंगे की तरह है। यह एक मुद्दा हो सकता है।

+2

चीजें हैं जो गलत पर मूल्यांकन की एक पूरी सूची के लिए देखें [सच्चाई मूल्य परीक्षण] (https://docs.python.org/2/library/stdtypes.html#truth-value-testing), उनमें से कुछ कुछ के लिए आश्चर्य की बात हो सकती है । – ecerulm

2

IfLoop का उत्तर (और MatToufoutu की टिप्पणी) स्टैंडअलोन चर के लिए बहुत अच्छा काम करता है, लेकिन मैं सूचियों, tuples, या शब्दकोश में व्यक्तिगत प्रविष्टियों के लिए कुछ ऐसा करने की कोशिश करने के लिए उत्तर देना चाहता था।

शब्दकोश

existing_dict = {"spam": 1, "eggs": 2} 
existing_dict["foo"] = existing_dict["foo"] if "foo" in existing_dict else 3 

रिटर्न {"spam": 1, "eggs": 2, "foo": 3}

सूचियाँ

existing_list = ["spam","eggs"] 
existing_list = existing_list if len(existing_list)==3 else 
       existing_list + ["foo"] 

रिटर्न ["spam", "eggs", "foo"]

tuples

existing_tuple = ("spam","eggs") 
existing_tuple = existing_tuple if len(existing_tuple)==3 else 
       existing_tuple + ("foo",) 

रिटर्न ("spam", "eggs", "foo")

(एक "एकल" टपल परिभाषित करने के लिए ("foo",) में अल्पविराम मत भूलना।)

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

+0

आपके सभी उत्तर टूटे हैं। –

+1

@ सेबेस्टियनडेपेज़ आप वास्तव में सही थे। इंगित करने के लिए धन्यवाद। मैंने बाद में मुद्दों को हल करने के लिए संपादन किए हैं। –

10

मैं भी रूबी से आ रहा हूँ तो मैं वाक्य रचना foo ||= 7 प्यार करता हूँ।

यह निकटतम बात मैं मिल सकती है।

foo = foo if 'foo' in vars() else 7 

मैंने देखा है लोगों को एक dict के लिए ऐसा करते हैं:

try: 
    foo['bar'] 
except KeyError: 
    foo['bar'] = 7 

Upadate: हालांकि, मैं हाल ही में इस मणि पाया:

foo['bar'] = foo.get('bar', 7) 
कि जैसे आप हैं

, तो एक नियमित रूप से चर के लिए आप कुछ इस तरह कर सकता है:

vars()['foo'] = vars().get('foo', 7) 
+0

कक्षा में उदाहरण चर के लिए यह कैसे काम करेगा? self.foo = ...? – CodeKid

+1

@CodeKid 'self.foo = self .__ dict __। प्राप्त करें ('foo', 7)' –

+1

@ कोडकिड या, 'self.foo = getattr (self,' foo ', 7) ' – kkurian

संबंधित मुद्दे