假设我有def validate4(username,password):
con = sqlite3.connect('static/Users.db')
with con:
cur = con.cursor()
cur.execute("SELECT * FROM Nbc")
users = cur.fetchall()
for user in users:
dbUser = user[0]
dbPass = user[1]
if dbPass == password:
completion=(dbUser, username)
return users
@app.route('/nbc', methods=['GET', 'POST'])
def nbc():
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
users= validate4(username,password)
return render_template('nbc.html', users=users)
else:
flash ( 'Invalid Credentials. Please try again.')
return render_template('nbc.html')
,属性为<html lang="en">
<head>
<link rel="stylesheet" href="/static/event.css" type="text/css">
</head>
<body>
<form action="/nbc" method="POST">
<div class="login">
<div class="login-screen">
<div class="app-title">
<h1>Login</h1>
</div>
<div class="login-form">
<div class="control-group">
<input type="text" class="login-field" placeholder="username" name="username" value="{{ request.form.username }}">
<label class="login-field-icon fui-user" for="login-name"></label>
</div>
<div class="control-group">
<input type="password" class="login-field" placeholder="password" name="password" value="{{ request.form.password }}">
<label class="login-field-icon fui-lock" for="login-pass"></label>
</div>
<input type="submit" value="Log in" class="btn btn-primary btn-large btn-block">
<br>
<div id="navbar" class="app-titl">
<a class="nav navbar-nav"></a>
<li class="active"><a href="{{ url_for('index') }}">Home</a></li>
<a href="{{ url_for('index') }}"></a>
</div>
</div>
</div>
</div>
</form>
{% if users%}
<div class="table">
<table>
{%for user in users%}
<ul style="list-style-type:disc">
<li>{{user[2]}}</li>
<li>{{user[3]}}</li>
<li>{{user[4]}}</li>
</ul>
{%endfor%}
</table>
</div>
{%endif%}
</body>
</html>
,MyObject
,attr_a
和attr_b
如果它们具有相同的attr_c
,quantity.
和attr_a
这是一个例子,也是我的方法。有一个更好的方法吗?例如;如果我想在合并列表后保留列表的顺序怎么办?
attr_b
答案 0 :(得分:2)
好吧,我认为针对特定用例“定制” __eq__
等不是一个好主意:现在,这意味着MyObject("AAA", "BBB", "A123", 1000)
被认为等于{{1} }。对于将这些对象“合并”在一起的用例,这可能会起作用,但这意味着其他(直接)用例可能会导致很多额外的逻辑。
我要避免的另一件事是更改现有的MyObject("AAA", "BBB", "A123", 1425)
的数量:您不知道指向该对象的变量是什么。结果,这可能意味着突然包含MyObject
的列表具有MyObject
不同的列表。
实现像quantities
这样的功能可能会更好:
get_key
然后我们执行或多或少相似的算法,但是我们构造了新的class MyObject:
def __init__(self, attr_a, attr_b, attr_c, quantity):
self.attr_a = attr_a
self.attr_b = attr_b
self.attr_c = attr_c
self.quantity = quantity
def get_key(self):
return (self.attr_a, self.attr_b, self.attr_c)
def __repr__(self):
return "<{}, {}, {}, {}>".format(self.attr_a, self.attr_b, self.attr_c, self.quantity)
:
MyObject
使用某种from collections import defaultdict
res = defaultdict(int)
for obj in objs:
res[obj.get_key()] += obj.quantity
result = [MyObject(*k, v) for k, v in res.items()]
函数将clone
与新数量一起复制也可以改善代码设计。