如何减少到只有一次尝试,除了语句

2024-04-26 07:30:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一本包含多个try-except语句的词典。 我试图用r.get()检索值,但它抛出了一个NoneObject类型错误。我知道.get()的默认参数是None,但它不起作用。我有多个列表,每次迭代时都会附加来自不同字典值的数据。你知道吗

如何将代码简化为一个try except语句?谢谢您!你知道吗

这是我的密码:

for num in issue_number:
    print(num)
    Response = requests.get(f'https://example.com/rest/api/2/issue/Proj-{num}?expand=changelog&maxResults =1000', auth=(example))
    r = Response.json()
    try:
        task_list.append(r['key'])
    except TypeError:
        task_list.append('NA')
    try:
        summary_list.append(r['fields']['summary'])
    except TypeError:
        summary_list.append('NA')
    try:
        assignee_list.append(r['fields']['assignee']['displayName'])
    except TypeError:
        assignee_list.append('NA')
    try:
        created_list.append(r['fields']['created'])
    except:
        created_list.append('NA')
    try:
        status_list.append(r['fields']['status']['name'])
    except:
        status_list.append('NA')
    try:
        due_date_list.append(r['fields']['duedate'])
    except:
        due_date_list.append('NA')
    try:
        resolution_list.append(r['fields']['resolution']['name'])
    except:
        resolution_list.append('NA')
    try:
        resolution_date_list.append(r['fields']['resolutiondate'])
    except:
        resolution_date_list.append('NA')

Tags: fieldsgetdatestatussummarynumlisttry
3条回答

我倾向于将这类代码重构为:

from collections import namedtuple

Issue = namedtuple('Issue', [
  'task_key', 'summary', 'assignee', 'created'
])

import logging
logger = logging.getLogger(__name__)

def get_issue(num):
  res = requests.get(f'https://example.com/rest/api/2/issue/Proj-{num}?expand=changelog&maxResults=1000', auth=(example))
  res.raise_for_status()
  r = res.json()
  return Issue(
    r['key'], r['fields']['summary'],
    r['fields']['assignee']['displayName'],
    r['fields']['created'],
  )

issues = {}
for num in issue_number:
  try:
    issues[num] = get_issue(num)
  except:
    logger.exception("unable to process issue %s", num)

如果您真的想获取部分条目,那么使用@jdehesa中的get_deep可能会很有用

您可以通过链接多个get调用来避免所有这些:

for num in issue_number:
    print(num)
    Response = requests.get(f'https://example.com/rest/api/2/issue/Proj-{num}?expand=changelog&maxResults =1000', auth=(example))
    r = Response.json()
    task_list.append(r.get('key', 'NA'))
    summary_list.append(r.get('fields', {}).get('summary', 'NA'))
    assignee_list.append(r.get('fields', {}).get('assignee', {}).get('displayName','NA'))
    created_list.append(r.get('fields', {}).get('created', 'NA'))
    status_list.append(r.get('fields', {}).get('status', {}).get('name', 'NA'))
    due_date_list.append(r.get('fields', {}).get('duedate', 'NA'))
    resolution_list.append(r.get('fields', {}).get('resolution', {}).get('name', 'NA'))
    resolution_date_list.append(r.get('fields', {}).get('resolutiondate', 'NA'))

但是,由于您多次执行相同的操作,因此使用函数可能会更方便,例如:

def get_deep(d, *keys, default=None):
    for k in keys:
        if not d or k not in d:
            # Stop early if a key is not found
            return default
        d = d[k]
    return d if d is not None else default

# ...

for num in issue_number:
    print(num)
    Response = requests.get(f'https://example.com/rest/api/2/issue/Proj-{num}?expand=changelog&maxResults =1000', auth=(example))
    r = Response.json()
    task_list.append(get_deep(r, 'key', default='NA'))
    summary_list.append(get_deep(r, 'fields', 'summary', default='NA'))
    assignee_list.append(get_deep(r, 'fields', 'assignee', 'displayName', default='NA'))
    created_list.append(get_deep(r, 'fields', 'created', default='NA'))
    status_list.append(get_deep(r, 'fields', 'status', 'name', default='NA'))
    due_date_list.append(get_deep(r, 'fields', 'duedate', default='NA'))
    resolution_list.append(get_deep(r, 'fields', 'resolution', 'name', default='NA'))
    resolution_date_list.append(get_deep(r, 'fields', 'resolutiondate', default='NA'))

您可以将密钥作为元组存储在某个列表中,然后检查这些密钥对是否存在于r,如果存在,请将它们添加到status_list。你知道吗

necessary_keys = [('key'), ('fields', 'summary'), ('fields', 'assignee', 'displayName'),
                  ('fields', 'created'), ('fields', 'status', 'name'),
                  ('fields', 'duedate'), ('fields', 'resolution', 'name'),
                  ('fields', 'resolutiondate')]

def check_keys(dict_, keys):
    if keys[0] in dict_:
        if len(keys) == 1:
            return dict_[keys[0]]
        else:
            return check_keys(dict_[keys[0]], keys[1:])
    return 'NA'

issue_number = [0]
status_list = []

for num in issue_number:
    print(num)
    #Response = requests.get(f'https://example.com/rest/api/2/issue/Proj-{num}?expand=changelog&maxResults =1000', auth=(example))
    #r = Response.json()
    r = {'fields': {'summary': 'test1', 'status': {'name': 'test2'}}}

    for key in necessary_keys:
        status_list.append(check_keys(r, key))
    print(status_list)

输出:

['NA', 'test1', 'NA', 'NA', 'test2', 'NA', 'NA', 'NA']

相关问题 更多 >