#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}
Следующие сценарии, которые мне нужно рассмотреть:
- Мне нужно найти теги для каждого словаря, а также при этом мне нужно получить только
'managed'
ключ из тегов, если вtags
есть несколько элементов. - Если
'managed'
ключnull
, то установите его значение как'Not Tagged'
- Если
'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. Ок. добавлен код для покрытия и третьего. Посмотрите, полезно ли это. Если это так, проголосуйте за мой ответ и отметьте код как отвеченный. Рад подробнее остановиться на этом. Было забавно писать код для этого.