首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将多个try/except块转换为一个函数

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

Stack Overflow用户
提问于 2018-05-31 08:29:58
回答 1查看 53关注 0票数 0

这更多的是一个一般性的编程问题,而不是与实际代码相关。

我有这个丑陋的代码,它从JIRA获取输入,并多次将其从毫秒转换为小时,如下所示:

代码语言:javascript
复制
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操作,如下所示:

代码语言:javascript
复制
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)

但是,有三个变量链接到我需要迭代的每个函数调用-除了newaccsla_compnewaccsla_ongoing之外,还有保存每次try/的customfield_10705和名称。

以下是变量的顺序..即。field_list[0]链接到name_list[0]

代码语言:javascript
复制
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']

遍历这些的最好方法?谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-31 08:51:04

首先,如果您只需编辑convertMillis函数以返回np.nan而不是引发,则可以将这四行代码块中的每一个代码块转换为一行代码-或者,如果您无法做到这一点,则将该函数包装在另一个代码块中:

代码语言:javascript
复制
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上调用convertMillis。假设字段总是存在,并且总是有一个ongoingCycle,但并不总是有一个remainingTime属性,那该怎么办呢?然后,您可以将该部分推送到try:中,同时还可以进一步简化操作:

代码语言:javascript
复制
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)

如果异常出现在更高的位置-例如,如果字段并不总是有ongoingCycle-obviously,你需要在try:块中推入更多的表达式;我在这里只是猜测一下你试图用那个except:处理什么。

而且,既然这样,你真的想要一个空的except:吗?它将处理任何异常,而不仅仅是AttributeErrorValueError或您实际期望的任何类型的异常。

同时,您现有的jira_hours重构不起作用,因为当field是一个保存字符串的变量时,您不能只使用.field。解决这个问题的一种方法是:

代码语言:javascript
复制
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-which,我将在下面展示。

但你可以做得更好。你真的需要这些都是独立变量,而不是,比如说,字典中的项目吗?

代码语言:javascript
复制
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

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

但是,如果您确实需要这些变量成为独立变量-同样,您可能会这样做-您可以只使用globals()locals()而不是values来做同样的事情。

另一方面,如果您要重复使用comp/ongoing值对,只需将这些值对存储在dict:values[fieldname] = comp, ongoing中即可。

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50615071

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档