2010-08-21 4 views
15

क्या Python string.format का उपयोग करने का कोई तरीका है कि कोई अनुक्रमणिका अनुपलब्ध होने पर कोई अपवाद नहीं डाला जाता है, इसके बजाय एक खाली स्ट्रिंग डाली जाती है।पायथन स्ट्रिंग प्रारूप suppress/silent keyerror/indexerror

result = "i am an {error} example string {error2}".format(hello=2,error2="success") 

यहाँ, परिणाम होना चाहिए:

"i am an example string success" 

अभी, अजगर एक keyerror फेंकता है और स्वरूपण बंद हो जाता है। क्या इस व्यवहार को बदलना संभव है?

धन्यवाद

संपादित करें:

वहाँ Template.safe_substitute मौजूद है (यहां तक ​​कि उस पैटर्न के बजाय कोई रिक्त स्ट्रिंग डालने की अक्षुण्ण छोड़ देता है), लेकिन सकता है नहीं कुछ String.Format

के लिए समान वांछित व्यवहार php में स्ट्रिंग प्रतिस्थापन के समान होगा।

class Formatter(string.Formatter): 
    def get_value(self,key,args,kwargs): 
    try: 
     if hasattr(key,"__mod__"): 
      return args[key] 
     else: 
      return kwargs[key] 
    except: 
     return "" 

ऐसा वांछित व्यवहार प्रदान करता है।

+0

तुम भी 'str.format_map() का उपयोग कर सकते' में [इस उत्तर] (http वर्णित के रूप में://stackoverflow.com/a/17215533/877069)। –

उत्तर

5

दुर्भाग्यवश, नहीं, डिफ़ॉल्ट रूप से ऐसा करने का कोई तरीका नहीं है। हालांकि आप इसे defaultdict प्रदान कर सकते हैं या ओवरराइड __getattr__ साथ वस्तु, और इस तरह का उपयोग करें:

class SafeFormat(object): 
    def __init__(self, **kw): 
     self.__dict = kw 

    def __getattr__(self, name): 
     if not name.startswith('__'): 
      return self.__dict.get(name, '') 

print "i am an {0.error} example string {0.error2}".format(SafeFormat(hello=2,error2="success")) 
i am an example string success 
+1

धन्यवाद। इसके उपयोगकर्ता के रूप में, लेकिन फैबियन के रूप में उल्लेख किया गया है, –

18

str.format() एक मानचित्रण वस्तु की उम्मीद नहीं है। इस प्रयास करें:

from collections import defaultdict 

d = defaultdict(str) 
d['error2'] = "success" 
s = "i am an {0[error]} example string {0[error2]}" 
print s.format(d) 

आप एक str() कारखाना है कि रिटर्न "के साथ एक defaultdict हैं"। फिर आप डिफॉल्ट डिक्ट के लिए एक कुंजी बनाते हैं। प्रारूप स्ट्रिंग में, आप पास की गई पहली ऑब्जेक्ट की कुंजी एक्सेस करते हैं। यह आपको अन्य कुंजी और मानों को पारित करने की अनुमति देने का लाभ है, जब तक कि आपका डिफ़ॉल्ट डिक्शन format() पर पहला तर्क है।

इसके अलावा, http://bugs.python.org/issue6081

+0

के अलावा मैपिंग ऑब्जेक्ट्स को संभाल नहीं करता है, क्या इसे डिफॉल्टडिक्ट के बजाय एक फॉर्मेट ऑब्जेक्ट (विचार बग रिपोर्ट लिंक) का उपयोग कर सुधार किया जा सकता है? इस तरह, प्रारूप परिवर्तक के लिए कोई परिवर्तन wud reqd किया जा सकता है। धन्यवाद –

+0

कक्षा फॉर्मेटर (स्ट्रिंग।फ़ॉर्मेटर): डीईएफ़ get_value (स्वयं, कुंजी, आर्ग, kwargs): कोशिश: अगर hasattr (कुंजी, "__ mod__"): वापसी args [कुंजी] अन्य सभी : वापसी kwargs [कुंजी] को छोड़कर: वापसी " यह मेरे लिए काम करता है। लाभ यह है कि एक अतिरिक्त डिफ़ॉल्ट डिज़ाइन बनाने की कोई आवश्यकता नहीं है। –

+0

हाँ, यह अच्छी तरह से काम करता है। मुझे यकीन नहीं है कि एक अतिरिक्त फॉर्मेटर क्लास + ऑब्जेक्ट के दंड के खिलाफ अतिरिक्त डिफॉल्ट डिक्ट के दंड की तुलना कैसे करें, लेकिन कुछ परिस्थितियों में यह बेहतर हो सकता है, खासकर यदि यह कोड को स्पष्ट बनाता है। –

2

मैं एक संस्करण है कि डैनियल की विधि के लिए, लेकिन {0.x} विशेषता के उपयोग के बिना इसी तरह काम करता है बनाया देखते हैं। प्रारूप मैपिंग में तार के लिए बाहर

'{what} 2' 
12

import string  
class SafeFormat(object): 
    def __init__(self, **kw): 
     self.__dict = kw 

    def __getitem__(self, name): 
     return self.__dict.get(name, '{%s}' % name) 



string.Formatter().vformat('{what} {man}', [], SafeFormat(man=2)) 

प्रिंट आधिकारिक समाधान (Python 3 Docs) dict वर्ग उपवर्ग के लिए और जादू-विधि __missing__() परिभाषित करने के लिए है। इस विधि कहा जाता है कि जब भी कोई कुंजी याद आ रही है, और क्या यह रिटर्न स्ट्रिंग बजाय फ़ॉर्मेट करने के लिए प्रयोग किया जाता है:

class format_dict(dict): 
    def __missing__(self, key): 
     return "..." 

d = format_dict({"foo": "name"}) 

print("My %(foo)s is %(bar)s" % d) # "My name is ..." 

print("My {foo} is {bar}".format(**d)) # "My name is ..." 
+0

मैं सिर्फ इतना है कि कोशिश की और आप कर सकते हैं: 'कुछ {बात}' प्रारूप (format_dict ('अपने': तर्क)।) इसे प्रभावी ढंग से KeyError चुप्पी और टैग जो कुछ भी द्वारा __missing__ जादू समारोह लौटने की जगह। – thomas

+1

'.format (** format_dict ({" foo ":" name "})) 'बिल्कुल भी इस्तेमाल किया जा सकता है। सिंटैक्स त्रुटि की वजह से आपका स्निपेट असफल हो जाएगा। '.form' ('' '' '' '' '' '' '' '' '' '' '' '' 'के लिए अनिवार्य है, सीधे डिक्ट्स स्वीकार नहीं करता है। – CoDEmanX

+0

दरअसल, मेरी गलती। – thomas