2012-09-19 10 views
6

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

अनुभवहीन संस्करण:

prefix = 'hello0' 
while os.path.exists(prefix + '.abc') or os.path.exists(prefix + '.def') or os.path.exists(prefix + '.ghi'): 
    n = int(prefix[-1]) 
    prefix = prefix[:-1] + str(n + 1) # I know this doesn't work when n reaches two digits; my full code involves a regular expression 

हालत स्पष्ट रूप से बहुत लंबे और बदसूरत हो सकता है जब वहाँ एक्सटेंशन की एक जोड़ी की तुलना में अधिक हैं। मैंने इसे for लूप में समझाया।

मेरे संस्करण:

prefix = 'hello0' 
extensions = ('.abc', '.def', '.ghi') # there could be even more than this 
condition = True 
while condition: 
    condition = False 
    # if any of the paths still exist, set the condition back to True 
    for extension in extensions: 
     if os.path.exists(prefix + extension): 
      condition = True 

    n = int(prefix[-1]) 
    prefix = prefix[:-1] + str(n + 1) 

मैं अभी भी एक छोटा सा भद्दा होने के लिए इस लग रहा है: यह पूरी तरह से स्पष्ट क्या while पाश वास्तव में परीक्षण कर रहा है नहीं है। क्या एक बूलियन अभिव्यक्ति गतिशील रूप से एक बूलियन मान सेट करना संभव है?

मुझे लगता है कि निम्नलिखित काम हो सकता है (मैं इसे परीक्षण नहीं किया, मैं सिर्फ इसे इस लिखते समय सोचा था!), लेकिन मुझे नहीं लगता कि मैं eval का सहारा लेना होना चाहिए है:

prefix = 'hello0' 
extensions = ('.abc', '.def', '.ghi') 

test = 'False' 
for extension in extensions: 
    test += " or os.path.exists(prefix + '" + extension + "')" 
while eval(test): 
    n = int(prefix[-1]) 
    prefix = prefix[:-1] + str(n + 1) 

उत्तर

9

आप एक जनरेटर के साथ any() में निर्मित उपयोग कर सकते हैं:

while any(os.path.exists(prefix + extension) for extension in extensions): 

    # then increment prefix and try again, as in your example code 

यह True या False है कि आप एक सरल वाक्य रचना के साथ की जरूरत है गणना करता है।

सामान्य में, अगर मैं कभी प्रलोभन अजगर की तरह एक गतिशील भाषा में eval() उपयोग करने के लिए लग रहा है , तो इसका मतलब है एक महत्वपूर्ण भाषा विशेषता यह है कि मैं के बारे में जानने की जरूरत नहीं है। गतिशील भाषाओं को कोड कोड को लिखने और बनाए रखने की कोशिश करने की आपदा को कोड-लिखने-लिखने-और-कोड बनाने की आपदा है - इसलिए आपने अपने दृष्टिकोण के बारे में पूछकर बिल्कुल सही काम किया है।

+1

यह शॉर्ट-सर्किट मूल्यांकन भी करता है, जैसे कि 'या' अभिव्यक्तियों की एक स्ट्रिंग होगी। एक संबंधित 'सभी()' विधि भी है। –

+1

"... एक महत्वपूर्ण भाषा सुविधा है जिसके बारे में मुझे सीखना है।" पर्याप्त तनाव नहीं कर सकते हैं। यदि आपको कोई समस्या है, तो समाधान * कहीं * है। –

+0

'कोई भी' सही है, धन्यवाद। और मैं पूरी तरह से 'eval' के बारे में एक संकेत होने के बारे में सहमत हूं कि आपने भाषा के बारे में कुछ याद किया है! –

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