2017-10-11 88 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