在python

时间:2018-03-01 12:07:21

标签: python

重构此代码以清理它的最佳方法是什么:

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

3 个答案:

答案 0 :(得分:1)

  1. 将SQL命令解压缩到file.sql中。为函数提供sql文件的路径或sql文件的文本。
  2. 将标志重命名为其目的。
  3. 你的if和elif都将标志设置为1,为什么会有差异?将它与一个条件相结合
  4. '500'应该是函数的变量。
  5. 在“”“”“中写下函数的简短描述。如果需要,您可以指定每个参数。

答案 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)

但我不建议在这种情况下在生产代码中使用三元运算符,因为它通常会降低可读性。