2009-10-28 24 views
5

कोड के बाद:अजगर स्ट्रिंग प्रतिस्थापन/** kwargs weirdness

http://www.blah.com?id=%PLAYER_ID% 

:

File "/home/wells/py-mlb/lib/fetcher.py", line 25, in __init__ 
url = url.replace('%%s%' % key, str(kwargs[key])) 
ValueError: incomplete format 

स्ट्रिंग की तरह एक प्रारूप है:

def __init__(self, url, **kwargs): 
    for key in kwargs.keys(): 
     url = url.replace('%%s%' % key, str(kwargs[key])) 

निम्न अपवाद फेंकता मैं क्या गलत कर रहा हूं?

उत्तर

15

शायद आप %%s% के बजाय प्रारूप स्ट्रिंग %%%s%% चाहते हैं।

दो लगातार % संकेत एक शाब्दिक % के रूप में व्याख्या कर रहे हैं, तो अपने संस्करण में, आप एक शाब्दिक %, एक शाब्दिक s, और फिर एक अकेला % है, जो यह करने के बाद एक फॉर्मेट स्पेसिफायर उम्मीद कर रहा है। आप प्रत्येक शाब्दिक % करने के लिए एक प्रारूप स्ट्रिंग के रूप में व्याख्या नहीं की जा अप दोगुना करने की जरूरत है, तो आप %%%s%% हैं: शाब्दिक %, %s स्ट्रिंग के लिए, शाब्दिक %। आप इस तरह से बयान के लिए में मानों खोल सकता है जब शब्दकोश से अधिक पुनरावृत्ति

>>> '%%%s%%' % 'PLAYER_ID' 
'%PLAYER_ID%' 

भी:

+0

आह हाँ! बंद करें, लेकिन %%% s %% जो मैं चाहता था: तो यह एक प्रतिशत है, इसके बाद kwargs में वास्तविक कुंजी के बाद, प्रतिशत के बाद। लेकिन अब जब मैं अपने कोड में %%% s %% देखता हूं, तो यह वास्तव में परेशान दिखता है और मैं सोच रहा हूं कि क्या करने का एक अच्छा तरीका है जो मैं करने की कोशिश कर रहा हूं। – Wells

+0

पकड़ लिया, अब तय की। –

+0

@Wells: "% {0}%" आज़माएं। प्रारूप (kwargs [key]) –

3

आप प्रतिशत चिह्न दोगुना करने के लिए यह से बचने के लिए की जरूरत है

def __init__(self, url, **kwargs): 
    for key, value in kwargs.items(): 
     url = url.replace('%%%s%%' % key, str(value)) 
+0

सामान्य रूप से , पायथन 2.x कोड '' iteritems' items' से अधिक का उपयोग करने के लिए डिफ़ॉल्ट चाहिए; जबकि पूर्व एक जनरेटर है कि नक्शे iterates रिटर्न बाद स्मृति में एक सूची बनाता है। यह वास्तव में यहां कोई फर्क नहीं पड़ेगा, लेकिन सही आदत रखना अच्छा है। कि इसके अलावा, अच्छा लग रहा है। –

+0

हुह? आप py2k कोड के संकेत कहां देखते हैं? यह py3k है, और अस्तित्व में कोई 'iteritems' नहीं है। – SilentGhost

1

एडम लगभग यह था सही। करने के लिए अपने कोड में परिवर्तित करें:

def __init__(self, url, **kwargs): 
    for key in kwargs.keys(): 
     url = url.replace('%%%s%%' % key, str(kwargs[key])) 

जब कुंजी FOO, तो '%%%s%%' % key परिणाम '%FOO%' में है, और अपने url.replace तुम क्या चाहते हो जाएगा। एक प्रारूप स्ट्रिंग में, आउटपुट में दो प्रतिशत परिणाम प्रतिशत में होते हैं।

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