@zlodiak

Является ли try блоком?

В следующем коде есть два блока try. Переменная connection из первого блока используется во втором:
names = []
try:
    connection = psycopg2.connect(
        dbname=config.dbname, 
        user=config.user, 
        password=config.password, 
        host=config.host
    )
except Exception as e:
    print('error db connection')

try:
    cursor = connection.cursor()
    query = 'select * from names;'
    cursor.execute(query)
    records = cursor.fetchall() 
    for row in records:
        names.append(row[1])
except:
    print('error table data')


Я не понимаю как такое возможно, ведь try является блоком и по моему мнению видимость переменной connection ограничена первым блоком try, вне его она недоступна.

Однако во втором блоке запрос отрабатывает, используя значение переменной connection.

Скажите пожалуйста, try является каким-то особенным блоком, который не ограничивает область видимости?
  • Вопрос задан
  • 604 просмотра
Решения вопроса 1
longclaps
@longclaps
Не всё, что порождает отступы, порождает область видимости. Больше того, ничто, кроме определения функции, её не порождает )
Будет лучше, если ты сам подумаешь, почему это так. Но даже если нет - я объясню. Зачем область видимости внутри функции? Затем, чтобы будучи вызванной в разных контекстах (напр. с разными аргументами), она бы с этим справлялась. А теперь вопрос: в каких таких разных контекстах может выполняться блок try: ... except:. Да в одном-единственном контексте, в том, в котором он описан.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы