2009-10-28 11 views
5

:piton string değiştirme/** kwargs garabeti kod takiben

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 

dize gibi bir biçimdedir:

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

aşağıdaki istisna atar Neyi yanlış yapıyorum?

cevap

15

%%s% yerine %%%s%% biçim dizesini isteyebilirsiniz.

İki ardışık % işaretler bir hazır % olarak yorumlanır, böylece sürümünde, bunun ardından bir biçim belirteci bekliyor bir değişmez %, bir hazır s ve sonra yalnız % var. Her bir literal %'u bir biçim dizesi olarak yorumlanmayacak şekilde ikiye katlamanız gerekir, böylece %%%s%%: literal %, %s dizgisi, % dizgisi için. sözlüğe üzerinde yineleme zaman böyle deyimi için değerleri açmak olabilir ayrıca

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

:

+0

Ah evet! Kapat, ancak %%% s %% istediğim şey: bu yüzden yüzde, sonra kwargs'daki gerçek anahtar ve onu takip eden yüzde. Ama şimdi %%% s %% s koduma bakıyorum, gerçekten rahatsız edici görünüyor ve yapmaya çalıştığım şeyi yapmanın güzel bir yolu var mı diye merak ediyorum. – Wells

+0

Gotcha, şimdi düzeltildi. –

+0

@Wells: "% {0}%" biçimini deneyin. (Kwargs [anahtar]) –

3

bunu kaçmak için yüzde işareti çift gerekir

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

Genel olarak , Python 2.x kodu, 'item'leri üzerinden' iteritems 'kullanmak için varsayılan olmalıdır; İkincisi bellekte bir liste oluşturur; eski, haritayı tekrarlayan bir jeneratörü döndürür. Burada gerçekten bir fark yaratmayacak, ama doğru alışkanlığa sahip olmak güzel. Ayrıca, iyi görünüyor. –

+0

ha? py2k kodunun belirtilerini nerede görüyorsunuz? Py3k ve orada hiçbir iteritems yok. – SilentGhost

1

Adam neredeyse vardı sağ. kodunuzu değiştirin:

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

anahtar sonra FOO, '%FOO%' içinde '%%%s%%' % key sonuçları ise ve url.replace istediğini yapacak zaman. Bir biçim dizesinde iki yüzdelik, çıktıda yüzde ile sonuçlanır.