Как обрабатывать пропущенные ключи и нулевые значения для ключей, поступающих из словаря в python

#python

#python

Вопрос:

Пытаюсь обработать пропущенные ключи и нулевые значения для ключей, поступающих из словаря в python. Здесь все они resources есть tags , но некоторые нет. Я пытался обработать значения none, как показано ниже, но я продолжаю получать ошибки.

То, что я попробовал, это:

 tags_info = []
resource_list = client.resources.list()
for item in (resource_list):        
    tags = item.tags
    managed_tag_value = tags['managed']
    if not managed_tag_value:
        tags_info = {"Managed": "Not Managed"}
    else:    
        tags_info = {"Managed": managed_tag_value}
    print(tags_info)
  

Ошибка:

 managed_tag_value = tags['managed']
TypeError: 'NoneType' object is not subscriptable
  

Как я могу обрабатывать любые результаты none values в словаре, заполненном любым другим значением по умолчанию, например, недоступным или около того?

РЕДАКТИРОВАТЬ 1:

Примерные данные о том, как каждая итерация моего resources.list() вывода item , как показано ниже

 {'additional_properties': {}, 'id': '/subscriptions/xxxxxxxxx/resourceGroups/xxxxxxx/providers/Microsoft.Compute/snapshots/xxxxx', 'name': 'resourcename1', 'type': 'Microsoft.Compute/snapshots', 'location': 'southeastasia', 'tags': {'Name': 'xxxxxx', 'owner': 'xxxxxx', 'created date': '06022020', 'purpose': 'xxxx', 'Retention days ': 'NA'}, 'plan': None, 'properties': None, 'kind': None, 'managed_by': None, 'sku': xxxxxx, 'identity': None, 'created_time': None, 'changed_time': None, 'provisioning_state': None}
{'additional_properties': {}, 'id': '/subscriptions/xxxxxxxxxx/resourceGroups/xxxxxxx/providers/Microsoft.Compute/virtualMachines/xxxxx', 'name': 'resourcename2', 'type': 'Microsoft.Compute/virtualMachines', 'location': 'eastus', 'tags': {'Function': 'Fetch', 'Division': 'PH', 'managed_by': 'xxxxxx',  'managed': 'notbillable'}, 'plan': None, 'properties': None, 'kind': None, 'managed_by': None, 'sku': None, 'identity': None, 'created_time': None, 'changed_time': None, 'provisioning_state': None}
{'additional_properties': {}, 'id': '/subscriptions/xxxxxxxx/resourceGroups/xxxxxxx/providers/Microsoft.Compute/virtualMachines/xxxxx/extensions/MicrosoftMonitoringAgent', 'name': 'BastionRDP/MicrosoftMonitoringAgent', 'type': 'Microsoft.Compute/virtualMachines/extensions', 'location': 'eastus', 'tags': None, 'plan': None, 'properties': None, 'kind': None, 'managed_by': None, 'sku': None, 'identity': None, 'created_time': None, 'changed_time': None, 'provisioning_state': None}
  

Следующие сценарии, которые мне нужно рассмотреть:

  1. Мне нужно найти теги для каждого словаря, а также при этом мне нужно получить только 'managed' ключ из тегов, если в tags есть несколько элементов.
  2. Если 'managed' ключ null , то установите его значение как 'Not Tagged'
  3. Если 'tags' сам ключ не существует в словаре выше, тогда он должен отображать "Tags key missing"

Комментарии:

1. «Теги» иногда отсутствуют? Если да, вы не можете использовать теги[‘managed’].

2. да, иногда теги отсутствуют для какой-либо группы ресурсов, поэтому мне нужно напечатать для них как «не управляемые»

3. managed_tag_value = теги[‘managed’], если тегов еще нет

4. извините, не удалось получить это .. можете ли вы правильно отформатировать это, пожалуйста…

5. Я не знаю, чего еще вы хотите, я написал строку кода для вас.

Ответ №1:

Во-первых: tags["managed"] никогда не будет работать, если tags равно none. Это как печатать 9.5[0] . Вы просто не можете его проиндексировать, потому что у него нет индексов. Во-вторых, если вы хотите что-то напечатать, если они вводят none, НЕ редактируйте свой код и попробуйте это:

 try:
   [insert code here]
except TypeError as error:
    print("Not subscriptable")
  

Когда он выдает ошибку, оператор except улавливает ее, но только если он выдает ошибку типа. Это означает, что если вы поставите 9.5 вместо None , результат будет таким же.

Ответ №2:

Почему бы вам не попробовать проверить, существует ли ключ, прежде чем присваивать значение.

 tags_info = []
for item in client.resource_groups.list():
    print(item.name)
    tags = item.tags
    if 'managed' in tags.keys(): #this will prevent the error. assume tags is a dictionary
        managed_tag_value = tags['managed']
        if not managed_tag_value:
            tags_info = {"Managed": "Not Managed"}
        else:    
            tags_info = {"Managed": managed_tag_value}
        print(tags_info)
  

Вы могли бы даже еще больше упростить свой код, сделав это:

 tags_info = []
for item in client.resource_groups.list():
    print(item.name)
    tags = item.tags
    if 'managed' in tags.keys(): #this will prevent the error. assume tags is a dictionary
        tags_info = {"Managed": tags['managed']}
    else:    
        tags_info = {"Managed": "Not Managed"}
    print(tags_info)
  

Кроме того, не могли бы вы, пожалуйста, поделиться содержимым client.resource_groups. Это похоже на словарь. Возможно, будет проще упростить это еще больше.

Предполагая, что resource_groups — это словарь, а key имеет 'Managed' . в качестве значения вы можете сделать следующее.

Давайте предположим, что resource_groups — это словарь со следующими элементами данных:

 resource_groups = {
    'abcd':'sample data 1',
    'defg':'sample data 2',
    'pqrs':'sample data 3', 
    'wxyz':'sample data 4'}
  

Затем вы можете напрямую проверить, существует ли ключ 'wxyz' , и если он существует, вы можете что-то с этим сделать. Код будет выглядеть следующим образом.

 tag_info = {}
if 'wxyz' in resource_groups.keys():
    tags_info = {'Managed':resource_groups['wxyz']}
else:
    tags_info = {'Managed':'Not Managed'}
print(tags_info)
  

НОВЫЙ ОТВЕТ, ОСНОВАННЫЙ На ОБРАЗЦЕ ДАННЫХ

 r = {
 '1':{'additional_properties': {},
 'id': '/subscriptions/1111xxxxx/rest of text',
 'name': 'sxxxxxxx',
 'type': 'Microsoft.Compute/snapshots',
 'location': 'southeastasia',
 'tags': {
     'Name': '1111name',
     'owner': 'xxxxxx',
     'created date': '06022020',
     'purpose': 'xxxx',
     'Retention days ': 'NA'},
 'plan': None,
 'properties': None,
 'kind': None,
 'managed_by': None,
 'sku': 'xxxxxx',
 'identity': None,
 'created_time': None,
 'changed_time': None,
 'provisioning_state': None},

 '2':{'additional_properties': {},
 'id': '/subscriptions/2222xxxxxxx/rest of text',
 'name': '2222name',
 'type': 'Microsoft.Compute/virtualMachines',
 'location': 'eastus',
 'tags': {
     'Function': 'Fetch',
     'Division': 'PH',
     'managed_by': '222xxx',
     'managed': 'notbillable'},
 'plan': None,
 'properties': None,
 'kind': None,
 'managed_by': None,
 'sku': None,
 'identity': None,
 'created_time': None,
 'changed_time': None,
 'provisioning_state': None},

 '3':{'additional_properties': {},
 'id': '/subscriptions/3333xxxx/remaining text',
 'name': 'BastionRDP/MicrosoftMonitoringAgent',
 'type': 'Microsoft.Compute/virtualMachines/extensions',
 'location': 'eastus',
 'tags': None,
 'plan': None,
 'properties': None,
 'kind': None,
 'managed_by': None,
 'sku': None,
 'identity': None,
 'created_time': None,
 'changed_time': None,
 'provisioning_state': None}
}

tags_info = {}

for k,v in r.items():
    #first check if name is a key
    if 'name' in v.keys():
        #then store name as a value
        tags_info['name'] = v['name']
    else:
        #store 'No Name' as a value
        tags_info['name'] = 'No Name'
    #check if 'tags' is a key and
    #check if 'tags' is a dictionary
    if 'tags' in v.keys() and v['tags']:
        #check if 'managed' is a key inside 'tags' dictionary
        if 'managed' in v['tags'].keys():
            #then we got what we want
            tags_info['Managed'] = v['tags']['managed']
        else:
            #tags does not have 'managed' as a key
            tags_info['Managed'] = 'Not Managed'
        print (tags_info)
    else:
        #tags is not a dictionary so it is not managed
        tags_info['Managed'] = 'Not Managed'
        print (tags_info)
  

Вывод для приведенного выше кода:

 {'name': '1111name', 'Managed': 'Not Managed'}
{'name': '2222name', 'Managed': 'notbillable'}
{'name': 'BastionRDP/MicrosoftMonitoringAgent', 'Managed': 'Not Managed'}
  

Комментарии:

1. можете ли вы привести мне пример содержимого resource_group. Я думаю, вам могут не понадобиться теги и многие другие элементы.

2. Я составил несколько примеров данных, чтобы показать вам, как мы можем реализовать упрощенный код. посмотрите, поможет ли это вам.

3. смотрите мой новый ответ. Это длинный.

4. проверьте еще раз. дайте мне знать, если вы хотите, чтобы я напечатал ответ и для 3-го элемента

5. Ок. добавлен код для покрытия и третьего. Посмотрите, полезно ли это. Если это так, проголосуйте за мой ответ и отметьте код как отвеченный. Рад подробнее остановиться на этом. Было забавно писать код для этого.