Python 只拿了一个夸克

Python 只拿了一个夸克,python,keyword-argument,Python,Keyword Argument,我希望创建一个get_user()函数,用于从数据库检索用户记录。唯一的问题是,我希望在调用它的方式上允许一些灵活性,并允许它们调用函数,如下所示: 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 us

我希望创建一个get_user()函数,用于从数据库检索用户记录。唯一的问题是,我希望在调用它的方式上允许一些灵活性,并允许它们调用函数,如下所示:

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
获取用户(username=“testuser”)或获取用户(email=”testacct@gmail.com)或获取用户(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语句的情况下,如何获得one(也可能是唯一的)关键字

我可以迭代kwargs,制作一个键列表,并只获取列表的0索引,但这似乎是一种非常粗糙的方法。有没有一种更像python的方法来期望一个关键字参数,并且不去args,也不使用诸如getuser(“email”)之类的东西来获取它,testacct@gmail.com”)

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

k
v
是关键字参数的键和值

您也可以在Python2或Python3中执行
k=next(iter(kwargs))
。这将获得密钥,然后值就是
v=kwargs[k]


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

我相信
命名的双元组
在这种情况下可以很好地工作:

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
如果您确定(似乎是这样)只有一个键值对可以用来获取它:

keyword, value = kwargs.popitem()

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

为什么要将其作为
kwarg
呢?只需使用
def get\u用户(参数名称、参数值):
然后类似于
如果参数名称不在参数列表中:
然后抛出一些exception@PatrickHaugh-进一步考虑,我认为这没有什么问题。它返回的结果是:TypeError:“dict_items”对象不是迭代器updated。忘记了Python 3实际上没有为
.items()返回迭代器
因此必须在其周围放置一个
iter()
。这与无序的字典有关吗?我认为该方法仅适用于列表。它是字典上的一个方法(我假设您的意思是
pop
,这是列表上的一个方法)。我添加了一个文档链接。它将返回一个随机的键值对。如果只有一个,那么就是那个。