Python 只拿了一个夸克
我希望创建一个get_user()函数,用于从数据库检索用户记录。唯一的问题是,我希望在调用它的方式上允许一些灵活性,并允许它们调用函数,如下所示: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
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
,这是列表上的一个方法)。我添加了一个文档链接。它将返回一个随机的键值对。如果只有一个,那么就是那个。