Keyname после имени функции - PullRequest
0 голосов
/ 06 августа 2020

Я использую boto3, чтобы проверить, существует ли уже стек облачной информации. Код для этого:

import boto3
import botocore

conn = boto3.client('cloudformation')
list_stack = conn.list_stacks()['StackSummaries']
for stack in list_stack:
    if stack['StackStatus'] == 'DELETE_COMPLETE':
        continue
    if stack['StackName'] == stack_name:
        return True
return False

conn.list_stack() возвращает dict.

Этот код работает правильно.

Я не понимаю, зачем мне поставить ['StackSummaries'] после list_stack ()? Я никогда не видел такого кода, в котором вы ставили бы ключ словаря после функции. Я просто не понимаю синтаксиса.

И если я не использую этот способ, я получаю это сообщение об ошибке:

TypeError: string indices must be integers

Итак, мне нужно использовать suntax, которого я не понимаю. Может кто-нибудь объяснить, как это работает?

1 Ответ

2 голосов
/ 07 августа 2020

Вывод для list_stacks():

{
    'StackSummaries': [
        {
            'StackId': 'string',
            'StackName': 'string',
            'TemplateDescription': 'string',
            'CreationTime': datetime(2015, 1, 1),
            'LastUpdatedTime': datetime(2015, 1, 1),
            'DeletionTime': datetime(2015, 1, 1),
            'StackStatus': 'CREATE_IN_PROGRESS'|'CREATE_FAILED'|'CREATE_COMPLETE'|'ROLLBACK_IN_PROGRESS'|'ROLLBACK_FAILED'|'ROLLBACK_COMPLETE'|'DELETE_IN_PROGRESS'|'DELETE_FAILED'|'DELETE_COMPLETE'|'UPDATE_IN_PROGRESS'|'UPDATE_COMPLETE_CLEANUP_IN_PROGRESS'|'UPDATE_COMPLETE'|'UPDATE_ROLLBACK_IN_PROGRESS'|'UPDATE_ROLLBACK_FAILED'|'UPDATE_ROLLBACK_COMPLETE_CLEANUP_IN_PROGRESS'|'UPDATE_ROLLBACK_COMPLETE'|'REVIEW_IN_PROGRESS'|'IMPORT_IN_PROGRESS'|'IMPORT_COMPLETE'|'IMPORT_ROLLBACK_IN_PROGRESS'|'IMPORT_ROLLBACK_FAILED'|'IMPORT_ROLLBACK_COMPLETE',
            'StackStatusReason': 'string',
            'ParentId': 'string',
            'RootId': 'string',
            'DriftInformation': {
                'StackDriftStatus': 'DRIFTED'|'IN_SYNC'|'UNKNOWN'|'NOT_CHECKED',
                'LastCheckTimestamp': datetime(2015, 1, 1)
            }
        },
    ],
    'NextToken': 'string'
}

Самый внешний элемент словаря - StackSummaries, который содержит список.

Итак, он возвращает список.

Вместо:

list_stack = conn.list_stacks()['StackSummaries']
for stack in list_stack:

они могли бы использовать:

stacks = conn.list_stacks()
for stack in stacks['StackSummaries']:

Хорошо то, что они назвали его list_stacks, что предполагает, что это содержимое list.

...