Во-первых, вы можете превратить каждый из этих четырехстрочных блоков в однострочный, если вы просто отредактируете свою функцию convertMillis
, чтобы она возвращала np.nan
вместо повышения, или, если вы не можете этого сделать, обернитефункция в другом:
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.
Или, может быть, исключение, которое вы пытаетесь обработать, идет немного дальше.Вы всегда звоните convertMillis
на <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)
Если исключение поднимается еще выше, например, если поле не 't всегда имеет ongoingCycle
- очевидно, вам нужно поместить больше выражения в блок try:
;Я действительно просто догадываюсь здесь о том, что вы пытаетесь с этим справиться except:
.
И, хотя у вас это получается, вы действительно хотите получить 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 / current, просто сохраните пары в файле dict: values[fieldname] = comp, ongoing
.
Кроме того, поскольку все имена пользовательских полей кажутся customfield_NNNNN
,Вы можете еще больше упростить вещи, сопоставив 'newaccsla': 10136
и т. д., а затем выполнив getattr(issue.fields, f'customfield_{customfield}')
.