只服用一只kwarg

时间:2017-10-11 00:12:56

标签: python kwargs

我正在寻找创建一个从数据库中检索用户记录的get_user()函数。唯一的问题是,我希望在调用方式方面允许一些灵活性,并允许他们将该函数称为:

get_user(username =" testuser")或get_user(email =" testacct@gmail.com")或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

我的问题是,如果没有冗长的else if语句,我怎样才能获得一个(并且可能是唯一的)关键字?

我可以迭代kwargs,创建一个键列表,并且只获取列表的0索引,但这似乎是一种非常hacky的方式。是否有一种更加pythonic的方式来期待一个关键字参数并采用它而不使用args并使用类似getuser的东西(" email",testacct @ gmail.com")?

3 个答案:

答案 0 :(得分:0)

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

kv是关键字参数的关键和值。

您也可以在Python 2或Python 3中执行k = next(iter(kwargs))。这将获取密钥,然后该值仅为v = kwargs[k]

您可以测试len(kwargs)以确保只有一个关键字参数。

答案 1 :(得分: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

答案 2 :(得分:0)

如果您确定(似乎是这样)只有一个键值对,您可以使用popitem来获取它:

keyword, value = kwargs.popitem()

请记住,这将从字典中删除键值对。在这种情况下并不重要。

相关问题