重构此代码以清理它的最佳方法是什么:
1)从数据库中选择为两列之间的百分比差异添加一列
2)循环遍历列的值
3)如果日期是过去的
4)如果价格大于500且百分比差异小于第一个参数设置标志为1
5)否则,如果价格低于500且百分比差异小于 第二个参数将标志设置为1
6)否则将标志保持为0
def calculateEmployeeSpend(read_cursor, flag_higher_amount, flag_lower_budget):
read_cursor.execute("SELECT distinct b.employee_id, b.amount, "
"s.spend, b.date, b.amount - s.spend as spend_left, "
"100.0*(b.amount - s.spend) / b.amount As PercentDiff FROM employee_budget_upload "
"As b JOIN employee_budget_spent As s ON b.employee_id = s.employee_id where b.amount != 0")
for employee_id, amount, spend, date, spend_left, percent_diff in read_cursor:
flag=0
date_of_amount = dt.strptime(date, "%d/%m/%Y")
if date_of_amount <= dt.now():
if amount > 500 and percent_diff < int(flag_higher_amount):
flag=1
if amount < 500 and percent_diff < int(flag_lower_amount):
flag=1
编辑:
如果符合以下条件,我已将ifs更改为:
if amount > 500 and percent_diff < int(flag_higher_amount) or amount < 500 and percent_diff < int(flag_lower_amount):
flag=1
答案 0 :(得分:1)
答案 1 :(得分:0)
由于似乎有几个跟踪状态的实例,从长远来看,将逻辑分解为类和方法可能会有所帮助。
答案 2 :(得分:0)
首先,&#39; best&#39;的定义取决于你的目标,如:可读性,效率,性能等。
在很多情况下,我喜欢通过阅读pandas DataFrame中的整个数据集来解决这样的任务,并利用一个(或引发)方便和富有表现力的熊猫习语。 或者,通过编写更复杂的SQL语句来解决数据库端的端到端任务。
对于重构的常见最佳实践,我建议将神奇的值外部化为&#34; 500&#34;或&#34;%d /%m /%Y&#34;到常量或方法参数。 给一个&#34;标志&#34;更自言自语的名字。 如果金额恰好等于500的情况故意导致标志等于零,那么它应该更好地明确地反映在评论中。 为了避免代码重复(flag = 1),最好组合if语句,如下所示:
if amount > 500 and percent_diff < int(flag_higher_amount) or \
amount < 500 and percent_diff < int(flag_lower_amount):
flag=1
您还可以创建一个具有自我说出名称的函数,并在这样的函数中移动整个条件:
if is_percent_inside_amount_bounds(
percent_diff, amount, flag_lower_amount, flag_higher_amount):
flag = 1
或只是
flag = is_percent_inside_amount_bounds(
percent_diff, amount, flag_lower_amount, flag_higher_amount)
如果金额相等,则500可以解释为金额<= 500,条件可以转换为更简洁:
flag = percent_diff < int(
flag_lower_amount if amount>500 else flag_higher_amount)
但我不建议在这种情况下在生产代码中使用三元运算符,因为它通常会降低可读性。