2017-10-11 91 views
2

我正在創建一個get_user()函數,用於從數據庫中檢索用戶記錄。唯一的一點是,我想允許它被調用的方式具有一定的靈活性,並允許它們調用函數:只考慮一個kwarg

get_user(username =「testuser」)或get_user(email =「[email protected] 「)或GET_USER(UID = 7)

我首先想到的是定義功能:

def get_user(**kwargs): 
    c, conn = connection(dict_cursor = True) 
    keyword = None # key that's passed in i.e username, email, etc. 
    data = c.execute("SELECT * FROM users where %s = %s",[escape_string(keyword), escape_string(kwargs[keyword]),]) 
    data = c.fetchone() 
    conn.close() 
    return data 

我的問題是,我怎麼能得到一個(和assumably是唯一的)的關鍵字沒有冗長一系列其他的if語句?

我可以通過kwargs進行迭代,創建一個鍵列表,並且只顯示列表中的0索引,但是這似乎是一種非常冒險的方式。是否有一個更pythonic方式期待一個關鍵字參數,並採取它沒有去參數和使用像getuser(「電子郵件」,testacct @ gmail.com「)?

+1

那爲什麼把它當作'kwarg'呢?只要有'def get_user(parameter_name,parameter_value):'然後像'如果parameter_name不在list_of_parameters:'然後拋出一些異常 –

+0

@PatrickHaugh - 進一步的想法,我想這沒什麼錯。 –

回答

0

嘗試k, v = next(iter(kwargs.items()))(在Python 2中,k, v = next(kwargs.iteritems())。

kv然後關鍵字參數的鍵和值。

你也可以只做到k = next(iter(kwargs))在任何的Python 2或Python 3這得到鑰匙,然後將值只是v = kwargs[k]

您可以測試len(kwargs)以確保只有一個關鍵字參數。

+0

它回來了:TypeError:'dict_items'對象不是迭代器 –

+0

已更新。忘記Python 3實際上不會爲'.items()'返回一個迭代器,所以必須在它周圍放一個'iter()'。 – kindall

0

我相信namedtuple會在這種情況下工作得很好:

from collections import namedtuple 
def get_user(**kwargs): 
    c, conn = connection(dict_cursor = True) 
    keyword = None # key that's passed in i.e username, email, etc. 
    data = c.execute("SELECT * FROM users where %s = %s",[escape_string(keyword), escape_string(kwargs[keyword]),]) 
    user_info = namedtuple("user_info", "username, email") 
    final_data = map(user_info.make_, data) 
    data = [i.email for i in final_data][0] #if you want to email 
    conn.close() 
    return data 
0

如果你是某些(似乎如此),世界上只有一個鍵值對,你可以使用popitem得到它:

keyword, value = kwargs.popitem() 

請記住,這將從字典中刪除鍵值對。在這種情況下不重要。

+0

這將與一個無序的字典?我認爲這種方法只適用於列表。 –

+0

這是字典上的一種方法(我假設你的意思是'pop',這是列表中的一種方法)。我添加了一個鏈接到文檔。它會返回一個隨機的鍵值對。如果只有一個,那就是那一個。 – MSeifert