2014-04-19 55 views
0

我不斷收到一個錯誤:「unhashable type:list」for line(routing_table [key] [0] = [[params],func]。我試圖將一個url和函數傳遞給路由函數。應該使用正則表達式來選擇其他函數的參數,最終目標是讀入「/ page/<page_id>」,然後選擇<page_id>並將其替換爲用戶輸入,然後該用戶輸入將被傳遞到函數中。不明白爲什麼這是行不通的。如何使用其他函數將參數傳遞到函數中?

import re 

routing_table = {} 

def route(url, func): 
    key = url 
    key = re.findall(r"(.+?)/<[a-zA-Z_][a-zA-Z0-9_]*>", url) 
    if key: 
     params = re.findall(r"<([a-zA-Z_][a-zA-Z0-9_]*)>", url) 
     routing_table[key][0] = [[params], func] 
    else: 
     routing_table[url] = func 

def find_path(url): 
    if url in routing_table: 
     return routing_table[url] 
    else: 
     return None 

def index(): 
    return "This is the main page" 

def hello(): 
    return "hi, how are you?" 

def page(page_id = 7): 
    return "this is page %d" % page_id 

def hello(): 
    return "hi, how are you?" 

route("/page/<page_id>", page) 

print(routing_table) 
+0

#2將允許你輸入你喜歡什麼,但是你可以通過使用'(反引號)字符周圍防止它被解釋爲HTML標記 - 像''。 –

+0

謝謝!我現在編輯。 – kcmallard

回答

1

我不知道爲什麼你正在使用re.findall如果你只在發現的第一個值感興趣。

儘管如此,您的問題僅僅是您對結果進行索引的方式:key是一個列表,正如錯誤所述,您不能使用列表作爲字典鍵。但是你已經把[0]放在第一組括號之外,所以Python解釋這個,因爲你想設置第一個值routing_table[key],而不是你想要使用第一個值key作爲設置的東西。

你真正的意思是這樣的:

routing_table[key[0]] = [[params], func] 
相關問題