这是一个更一般的编程问题,而不是与实际代码相关的问题
我有一个难看的代码,它从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)
但是,有三个变量链接到我需要迭代的每个函数调用—保存每个try/的customfield_10705
和名称newaccsla_comp
和newaccsla_ongoing
变量按顺序排列。。即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']
迭代这些的最佳方法是什么?谢谢
首先,如果您只需编辑
convertMillis
函数以返回np.nan
而不是提升函数,则可以将这四个行块中的每一个都转换为一个行,或者,如果您不能这样做,则可以将函数包装为另一个行:或者,也许你试图处理的异常会更进一步。你总是在
<something>.remainingTime.millis
上给convertMillis
打电话。如果字段总是存在,并且总是有一个ongoingCycle
,但是它并不总是有remainingTime
属性呢?然后您可以将该部分推入try:
,同时还可以进一步简化:如果异常出现得更高—例如,如果字段不总是有
ongoingCycle
—显然您需要在try:
块内推送更多的表达式;我真的只是想猜测一下你想处理什么而且,当你这么做的时候,你真的想要一个光秃秃的
except:
?它将处理任何异常,而不仅仅是AttributeError
或ValueError
或您实际期望的任何类型的异常同时,现有的
jira_hours
重构无法工作,因为当field
是一个包含字符串的变量时,不能只使用.field
。解决这个问题的方法之一是:另一种解决方法是使用
getattr
——我将在下面展示但你可以做得更好。你真的需要这些都是自变量,而不是,比方说,dict中的条目吗
现在,您必须使用
values['newaccsla_comp']
,而不是使用newaccsla_comp
。但是我怀疑你的代码实际上会做很多代码,你会为每个变量复制和粘贴相同的东西,你可以用在dict上循环的代码来代替但是如果你真的需要这些变量作为自变量,你也可以用
globals()
或者locals()
来代替values
另一方面,如果您要在comp/正在进行的值对上重复自己,只需将这些值对存储在dict:
values[fieldname] = comp, ongoing
另外,由于所有自定义字段名似乎都是
customfield_NNNNN
,您可以通过映射'newaccsla': 10136
等,然后执行getattr(issue.fields, f'customfield_{customfield}')
,进一步简化操作相关问题 更多 >
编程相关推荐