[英]Is there a pythonic way to control the flow depending on kwargs in a function?
我有register_users列表,其中包含用户对象列表,每个用户 object 都有密码,用户名,email属性我想创建一个登录 function从输入中获取 ** kwarg 。
可以通过 3 种不同的方式将kwargs输入提供给 function。
kwargs 可能有 3 个密钥username、password 和 email 。
kwargs 可能有 2 个密钥username 或 password 。
kwargs 可能有email 或密码。
综上所述,我们必须检查register_user列表中是否有一个用户 object 的信息与给定的输入相同。
我的问题是确定如何给出 kwargs 输入的最佳方法是什么?以及如何在最少使用if、ifelse或 python 方式的情况下做到这一点。
class User:
def __init__(self, username, password, email):
self.username = username
self.email = email
self.password = password
user1 = User("user1", "user1@test.com", "test12345")
user2 = User("user2", "user2@test.com", "test12345")
register_users = [user1, user2]
def login(**kwargs):
pass # determine how kwargs is given to function and then check informations
login({"username": "user1", "email": "user1@test.com", "password": "test12345"})
login({"username": "user1", "password": "test12345"})
login({"email": "user1@test.com", "password": "test12345"})
从逻辑上讲,您总是需要密码,以及用户名或 email。 pythonic 的方法是从kwargs
中检索这些字段并利用它来验证输入参数。 从那里您可以使用getattr
从用户那里检索用户名 email 。
def login(**kwargs):
try:
password = kwargs["password"]
if "email" in kwargs:
auth_field, auth_value = "email", kwargs["email"]
else:
auth_field, auth_value = "username", kwargs["username"]
except KeyError:
raise ValueError("Login requires password and either username or email")
found_user = None
for user in registered_users:
if user.password == password and getattr(user, auth_field) == auth_value:
found_user = user
break
我假设这仅适用于 Stackoverflow,但在实际系统中,您可能不希望将用户存储在列表中,实际密码检查会稍微复杂一些
如果我们要检查用户名/电子邮件中的任何一个,则编辑以回答评论中的问题,或者两者都存在
def login(**kwargs):
try:
password = kwargs["password"]
auth_fields = {}
if "email" in kwargs:
auth_fields["email"] = kwargs["email"]
if "username" in kwargs:
auth_fields["username"] = kwargs["username"]
except KeyError:
raise ValueError("Login requires password and either username or email")
found_user = None
for user in registered_users:
if user.password == password and all([getattr(user, field) == value for field, value in auth_fields.items()):
found_user = user
break
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.