2009-10-28 41 views
5

Tiếp theo mã:python chuỗi thay thế với nhân vật%/** kwargs weirdness

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

Ném ngoại lệ sau đây:

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

Chuỗi có một định dạng như:

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

Tôi đang làm gì sai?

Trả lời

15

Bạn có thể muốn chuỗi định dạng %%%s%% thay vì %%s%.

Hai liên tiếp % dấu hiệu được hiểu như là một chữ %, vì vậy trong phiên bản của bạn, bạn có một literal %, một chữ s, và sau đó một duy nhất %, được mong đợi một specifier định dạng sau nó. Bạn cần phải tăng gấp đôi mỗi chữ số % để không được hiểu là chuỗi định dạng, vì vậy bạn muốn %%%s%%: chữ %, %s cho chuỗi, chữ số %.

+0

Ah vâng! Đóng, nhưng %%% s %% là những gì tôi muốn: vì vậy nó là một phần trăm, theo sau là khóa thực tế trong kwargs, tiếp theo là một phần trăm. Nhưng bây giờ mà tôi nhìn vào %%% s %% trong mã của tôi, nó trông thực sự gây phiền nhiễu và tôi tự hỏi nếu có một cách tốt đẹp để làm những gì tôi đang cố gắng để làm. – Wells

+0

Gotcha, đã được sửa ngay bây giờ. –

+0

@Wells: try "% {0}%" định dạng (kwargs [key]) –

3

bạn cần phải tăng gấp đôi hiệu tỷ lệ phần trăm để thoát khỏi nó:

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

cũng có khi lặp lại trong từ điển mà bạn có thể giải nén các giá trị trong câu lệnh for như thế này:

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

Nói chung , Python 2.x mã nên mặc định để sử dụng 'iteritems' trên' mục'; sau này tạo ra một danh sách trong bộ nhớ trong khi trước đây trả về một trình tạo lặp lại bản đồ. Nó sẽ không tạo sự khác biệt ở đây thực sự, nhưng nó là tốt để có thói quen đúng. Bên cạnh đó, có vẻ tốt. –

+0

huh? bạn thấy dấu hiệu của mã py2k ở đâu? nó là py3k, và không có 'iteritems' tồn tại. – SilentGhost

1

Adam gần như đã có nó đúng. Thay đổi mã của bạn để:

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

Khi trọng là FOO, sau đó '%%%s%%' % key kết quả trong '%FOO%' và url.replace của bạn sẽ làm những gì bạn muốn. Trong một chuỗi định dạng, hai phần trăm dẫn đến một phần trăm trong đầu ra.

Các vấn đề liên quan