2012-04-15 13 views
5

हाल ही में, मुझे ''.format फ़ंक्शन बहुत उपयोगी पाया गया क्योंकि यह % फ़ॉर्मेटिंग की तुलना में बहुत अधिक पठनीयता में सुधार कर सकता है। सरल स्ट्रिंग स्वरूपण प्राप्त करने के लिए कोशिश कर रहा है:पायथन का ".format" फ़ंक्शन

data = {'year':2012, 'month':'april', 'location': 'q2dm1'} 

year = 2012 
month = 'april' 
location = 'q2dm1' 
a = "year: {year}, month: {month}, location: {location}" 
print a.format(data) 
print a.format(year=year, month=month, location=location) 
print a.format(year, month, location) 

दो जबकि पहले प्रिंट प्रारूप के रूप में मैं उम्मीद करते हैं (हाँ, something=something बदसूरत दिखता है, लेकिन यह है कि केवल एक उदाहरण है), पिछले एक KeyError: 'year' उठाएंगे। क्या शब्दकोश बनाने के लिए पाइथन में कोई चाल है, इसलिए यह स्वचालित रूप से कुंजी और मान भर जाएगी, उदाहरण के लिए somefunc(year, month, location) आउटपुट {'year':year, 'month': month, 'location': location} होगा?

मैं अजगर के लिए काफी नया हूं और इस विषय पर कोई जानकारी नहीं मिल सका, हालांकि इस तरह की एक चाल मेरे वर्तमान कोड को काफी सुधार और कम कर देगी।

अग्रिम धन्यवाद और मेरी अंग्रेजी क्षमा करें।

उत्तर

6

पहले print

print a.format(**data) 

भी होना चाहिए, यदि आप कुछ शॉर्टकट पा रहे हैं, तो आप की तरह एक, कोई बड़ा अंतर लिख सकते हैं।

def trans(year, month, location): 
    return dict(year=year, month=month, location=location) 
+0

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

+0

@duke_nukem हाँ यह आपके वास्तविक उपयोग पर निर्भर करता है। कोड ठीक है और प्रारूप एपीआई पर्याप्त स्पष्ट है। यदि आप 'प्रारूप (* तर्क, ** kwargs)' जैसे कुछ हासिल करना चाहते हैं, तो यह भी किया जा सकता है, लेकिन मुझे नहीं लगता कि यह चीजों को आसान बना सकता है। – okm

1

आप dict() प्रतिदेय का उपयोग कर सकते हैं:

dict(year=yeah, month=month, location=location) 

जब कीवर्ड तर्क गुजर यह एक dict तत्वों आप kwargs के रूप में निर्दिष्ट युक्त पैदा करता है।

आप तर्क के नाम निर्दिष्ट करने के लिए नहीं करना चाहते हैं, .format() की स्थितीय शैली का उपयोग करें:

>>> a = 'year {0} month {1} location {2}' 
>>> print a.format(2012, 'april', 'abcd') 
year 2012 month april location abcd 

हालांकि, अगर आप क्या compact() in PHP (करने के लिए एक dict मानचित्रण चर नाम पैदा नहीं करता है करने के लिए कुछ इसी तरह करने की कोशिश नाम और चर अलग से निर्दिष्ट किए बिना इसके मूल्य), कृपया नहीं। यह सिर्फ बदसूरत अपठनीय कोड में परिणाम देता है और वैसे भी बुरा हैक की आवश्यकता होगी।

+0

हाँ, मैं dict के बारे में पता कर रहा हूँ() लेकिन मैं अनावश्यक कोड से बचने और थोड़ा सा इसे कम करने की कोशिश कर रहा हूं। .format रास्ते के बिना अपने विकल्प को स्वीकार कर सकते हैं()। धन्यवाद। –

+0

धन्यवाद, यह मेरी जरूरत के करीब है, हालांकि 10-12 तर्कों के साथ सूचकांक के माध्यम से नेविगेट करना बहुत मुश्किल हो जाता है। –

+0

इस मामले में आपको dict वाक्य का उपयोग करना चाहिए। हालांकि, आप जो करना चाहते हैं उसके आधार पर, वास्तविक टेम्पलेट इंजन जैसे [jinja2] (http://jinja.pocoo.org/) का उपयोग करने पर विचार करें। – ThiefMaster

1

आप locals() गुजारें सकता:

a.format(**locals()) 
बेशक

, इस मुद्दे हैं: आप स्थानीय लोगों में सब कुछ पारित करने के लिए होगा, और यह नाम के प्रभाव को समझने के लिए मुश्किल हो सकता है या एक चर को हटाने ।

एक बेहतर तरीका होगा:

a.format(**{k:v for k,v in locals() if k in ('year', 'month')}) 
# or; note that if you move the lambda expression elsewhere, you will get a different result 
a.format(**(lambda ld = locals(): {k:ld[k] for k in ('year', 'month')})()) 

लेकिन यह जब तक आप इसे एक समारोह (जो निश्चित रूप से एक dict पैरामीटर रखना चाहिए) के साथ लपेट, किसी भी अधिक संक्षिप्त नहीं है।

3
data = {'year':2012, 'month':'april', 'location': 'q2dm1'} 
a = "year: {year}, month: {month}, location: {location}" 

print a.format(**data) 

.. जो आप खोज रहे हैं। यह .format(year=data['year'], ...), या आपके द्वारा दिए गए अन्य उदाहरण करने के लिए कार्यात्मक रूप से समान है।

डबल-एस्टेरिक्स चीज खोजना मुश्किल है, इसलिए इसे आमतौर पर "क्वार्ग" कहा जाता है।यहाँ एक good SO question on this syntax

0

Python 3.6 के रूप में है, तो आप भी नए Formatted string literals (f-strings), जो आप चर साथ उपयोग कर सकते हैं का उपयोग कर सकते हैं:

year = 2012 
month = 'april' 
location = 'q2dm1' 
a = f"year: {year}, month: {month}, location: {location}" 
print(a) 

या एक शब्दकोश:

data = {'year': 2012, 'month': 'april', 'location': 'q2dm1'} 
a = f"year: {data['year']}, month: {data['month']}, location: {data['location']}" 
print(a) 

नोट स्ट्रिंग अक्षर से पहले f उपसर्ग।

PEP 498: Formatted string literals:

प्रारूपण स्ट्रिंग शाब्दिक 'म' द्वारा पहले से जुड़ा हुआ है और प्रारूप str.format द्वारा स्वीकार कर लिया तार के समान हैं कर रहे हैं()। उनमें घुंघराले ब्रेसिज़ से घिरे हुए फ़ील्ड प्रतिस्थापन होते हैं। प्रतिस्थापन क्षेत्रों भाव है, जो रन टाइम पर मूल्यांकन किया जाता है, और फिर स्वरूपित का उपयोग कर प्रारूप() प्रोटोकॉल हैं:

>>> 
>>> name = "Fred" 
>>> f"He said his name is {name}." 
'He said his name is Fred.' 
>>> width = 10 
>>> precision = 4 
>>> value = decimal.Decimal("12.34567") 
>>> f"result: {value:{width}.{precision}}" # nested fields 
'result:  12.35' 

...

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