代码之家  ›  专栏  ›  技术社区  ›  swifty

将多个try/except块转换为函数

  •  0
  • swifty  · 技术社区  · 8 年前

    我有一个难看的代码,它从jira获取一个输入,并将其从毫秒转换为几个小时,多次输出,如下所示:

    def convertMillis(ms):
        hours = ms / 1000 / 60 / 60
        return hours
    
    try:
        newaccsla_comp = convertMillis(issues.fields.customfield_10705.completedCycles[0].remainingTime.millis)
    except:
        newaccsla_comp = np.nan
    try:
        newaccsla_ongoing = convertMillis(issues.fields.customfield_10705.ongoingCycle.remainingTime.millis)
    except:
        newaccsla_ongoing = np.nan
    
    try:
        paymentssla_comp = convertMillis(issues.fields.customfield_10136.completedCycles[0].remainingTime.millis)
    except:
        paymentssla_comp = np.nan
    try:
        paymentssla_ongoing = convertMillis(issues.fields.customfield_10136.ongoingCycle.remainingTime.millis)
    except:
        paymentssla_ongoing = np.nan
    
    try:
        modifysla_comp = convertMillis(issues.fields.customfield_10713.completedCycles[0].remainingTime.millis)
    except:
        modifysla_comp = np.nan
    try:
        modifysla_ongoing = convertMillis(issues.fields.customfield_10713.ongoingCycle.remainingTime.millis)
    except:
        modifysla_ongoing = np.nan
    
    try:
        MFsla_comp = convertMillis(issues.fields.customfield_10711.completedCycles[0].remainingTime.millis)
    except:
        MFsla_comp = np.nan
    try:
        MFsla_ongoing = convertMillis(issues.fields.customfield_10711.ongoingCycle.remainingTime.millis)
    except:
        MFsla_ongoing = np.nan
    
    try:
        closeaccsla_comp = convertMillis(issues.fields.customfield_10140.completedCycles[0].remainingTime.millis)
    except:
        closeaccsla_comp = np.nan
    try:
        closeaccsla_ongoing = convertMillis(issues.fields.customfield_10140.ongoingCycle.remainingTime.millis)
    except:
        closeaccsla_ongoing = np.nan
    
    try:
        casla_comp = convertMillis(issues.fields.customfield_10213.completedCycles[0].remainingTime.millis)
    except:
        casla_comp = np.nan
    try:
        casla_ongoing = convertMillis(issues.fields.customfield_10213.ongoingCycle.remainingTime.millis)
    except:
        casla_ongoing = np.nan
    
    try:
        at_comp = convertMillis(issues.fields.customfield_10144.completedCycles[0].remainingTime.millis)
    except:
        at_comp = np.nan
    try:
        at_ongoing = convertMillis(issues.fields.customfield_10144.ongoingCycle.remainingTime.millis)
    except:
        at_ongoing = np.nan
    
    try:
        modfeesla_comp = convertMillis(issues.fields.customfield_10134.completedCycles[0].remainingTime.millis)
    except:
        modfeesla_comp = np.nan
    try:
        modfeesla_ongoing = convertMillis(issues.fields.customfield_10134.ongoingCycle.remainingTime.millis)
    except:
        modfeesla_ongoing = np.nan
    
    try:
        tdsla_comp = convertMillis(issues.fields.customfield_11200.completedCycles[0].remainingTime.millis)
    except:
        tdsla_comp = np.nan
    try:
        tdsla_ongoing = convertMillis(issues.fields.customfield_11200.ongoingCycle.remainingTime.millis)
    except:
        tdsla_ongoing = np.nan
    
    try:
        querysla_comp = convertMillis(issues.fields.customfield_10142.completedCycles[0].remainingTime.millis)
    except:
        querysla_comp = np.nan
    try:
        querysla_ongoing = convertMillis(issues.fields.customfield_10142.ongoingCycle.remainingTime.millis)
    except:
        querysla_ongoing = np.nan
    
    try:
        recsla_comp = convertMillis(issues.fields.customfield_15600.completedCycles[0].remainingTime.millis)
    except:
        recsla_comp = np.nan
    try:
        recsla_ongoing = convertMillis(issues.fields.customfield_15600.ongoingCycle.remainingTime.millis)
    except:
        recsla_ongoing = np.nan
    
    try:
        reportsla_comp = convertMillis(issues.fields.customfield_15601.completedCycles[0].remainingTime.millis)
    except:
        reportsla_comp = np.nan
    try:
        reportsla_ongoing = convertMillis(issues.fields.customfield_15601.ongoingCycle.remainingTime.millis)
    except:
        reportsla_ongoing = np.nan
    

    我很乐意做一些事情,比如获取所有自定义字段,将它们放在一个列表中,然后在函数上执行for,如下所示:

    field_list = ['customfield_10705','customfield_10136','customfield_10713','customfield_10711','customfield_10140','customfield_10213','customfield_10144','customfield_10134','customfield_11200','customfield_10142','customfield_15600','customfield_15601']
    
    
      def get_jira_hours(field):
            try:
                newaccsla_comp = convertMillis(issues.fields.field.completedCycles[0].remainingTime.millis)
            except:
                newaccsla_comp = np.nan
            try:
                newaccsla_ongoing = convertMillis(issues.fields.field.ongoingCycle.remainingTime.millis)
            except:
                newaccsla_ongoing = np.nan
    
    for field in field_list:
        get_jira_hours(field)
    

    但是,有三个变量链接到每个函数调用,我需要在- customfield_10705 以及保存每个try/except的名称 newaccsla_comp 和 newaccsla_ongoing .

    下面是变量顺序。IE. field_list[0] 链接到 name_list[0]

    field_list = ['customfield_10705','customfield_10136','customfield_10713','customfield_10711','customfield_10140','customfield_10213','customfield_10144','customfield_10134','customfield_11200','customfield_10142','customfield_15600','customfield_15601']
    
    name_list = ['newaccsla','paymentssla','modifysla','MFsla','closeaccsla','casla','at','modfeesla','tdsla','querysla','recsla','reportssla']
    

    最好的迭代方法是什么?谢谢。

    1 回复  |  直到 8 年前
        1
  •  4
  •   abarnert    8 年前

    首先,如果您只需编辑 convertMillis 要返回的函数 np.nan 如果做不到这一点,请将函数包装在另一个函数中,而不是raisingor:

    def convertMillisOrNan(millis):
        try:
            return convertMillis(millis)
        except:
            return np.nan
    
    newaccsla_comp = convertMillisOrNan(issues.fields.customfield_10705.completedCycles[0].remainingTime.millis)
    newaccsla_ongoing = convertMillisOrNan(issues.fields.customfield_10705.ongoingCycle.remainingTime.millis)
    # etc.
    

    或者,你试图处理的异常可能会更进一步。你总是打电话来 康特米利斯 在 <something>.remainingTime.millis 。如果,比如说,这个领域总是存在的,并且总是有一个 ongoingCycle ,但这并不总是有 remainingTime 属性?然后你可以把那部分插入 try: ,同时还可以进一步简化:

    def convertCycle(cycle):
        try:
            return convertMillis(cycle.remainingTime.millis)
        except:
            return np.nan
    newaccsla_comp = convertCycle(issues.fields.customfield_10705.completedCycles[0])
    newaccsla_ongoing = convertCycle(issues.fields.customfield_10705.ongoingCycle)
    

    如果异常更高,例如,如果字段不总是有 循环 尝试: 布洛克,我真的只是在猜测你要处理的是什么 except: .


    当你在做的时候,你真的想 除外: ?这将处理任何异常,而不仅仅是 AttributeError 或 ValueError 或者你所期待的任何例外。


    同时,你的存在 jira_hours 重构不起作用,因为您不能只使用 .field 什么时候 field 是包含字符串的变量。解决这个问题的一个方法是:

    def get_jira_hours(field):
        comp = convertCycle(field.completedCycles[0])
        ongoing = convertCycle(field.ongoingCycle)
        return comp, ongoing
    
    newaccsla_comp, newaccsla_ongoing = get_jira_hours(issues.fields.customfield_10705)
    paymentssla_comp, paymentssla_ongoing = get_jira_hours(issues.fields.customfield_10136)
    # etc.
    

    另一种解决方法是 getattr 我将在下面展示。


    但你可以做得更好。你真的需要这些都是自变量,而不是,比方说,一个字典里的条目吗?

    fieldmap = {
        'newaccsla': 'customfield_10136',
        'paymentssla': 'customfield_10705',
        # etc.
    }
    
    values = {}
    for fieldname, customfieldname in fieldmap.items():
        field = getattr(issues.fields, customfieldname)
        comp, ongoing = get_jira_hours(field)
        values[f'{fieldname}_comp'] = comp
        values[f'{fieldname}_ongoing'] = ongoing
    

    现在,不要用 newaccsla_comp ,你必须使用 values['newaccsla_comp'] 。但我怀疑你的代码实际上会做很多代码,你复制和粘贴同样的东西给每个变量,你可以替换为代码,只是在dict上循环。

    但是如果你真的需要这些是独立的变量,同样,你也可以通过使用 globals() 或 locals() 而不是 values .

    另一方面,如果要在comp/正在进行的值对上重复自己的操作,只需将这些值对存储在dict中: values[fieldname] = comp, ongoing .

    另外,因为所有自定义字段名似乎都是 customfield_NNNNN ,您可以通过映射进一步简化 'newaccsla': 10136 等等,然后 getattr(issue.fields, f'customfield_{customfield}') .