ссылка на Python UnboundLocalError перед назначением - PullRequest
0 голосов
/ 21 мая 2018

Я вижу, что это обычная ошибка, но я не вижу ответа для моего случая.

UnboundLocalError: локальная переменная 'tfstate_dict', на которую ссылается перед присваиванием

#!/usr/bin/env python
import json


def main():
    get_sfleet_id()

def get_sfleet_id():
    try:
        f=open("terraform_remote.tfstate", "r")
        contents =f.read()
        tfstate_dict = json.load(contents)

    except:
        print("error loading %s" % f)
    print(contents)
    print(tfstate_dict)

if __name__ == '__main__': main()

1 Ответ

0 голосов
/ 21 мая 2018

Как я писал в своем комментарии, tfstate_dict не появляется, пока вы не выйдете из блока try.Но это не значит, что это относится ко всему предшествующему коду;это просто относится к tfstate_dict, потому что это самая последняя строка.

Это легко проверить с помощью следующего:

try:
    a = int(2)
    b = int(3)
    c = int('hi')
except:
    print(locals())
    print()
    print(locals().get('a'))

Вы должны увидеть, что 'a' и 'b' оба определены и могут быть доступны (в зависимости от того, как вы выполняете этокод, в locals() тоже может быть много чего).Итак, существование 'a' и 'b' не дает вам гарантии того, что 'c' существует.

Есть две проблемы с вашей текущей обработкой исключений:

  1. Возможно, слишком многопроисходит в вашем блоке try так, как вы это делаете в настоящее время.Этот код потерпит неудачу, если файл не может быть найден, но вы не обязательно знаете, что происходит.И если ваш код изначально потерпел неудачу только на tfstate_dict = json.load(contents), вы теперь чесаете голову, почему вы вдруг получаете NameError на print(contents).
  2. Вы не хотите, чтобы вас поймалиэти проблемы с одеялом except.Как минимум, вы захотите использовать except Exception as e:, что также позволяет печатать e.

Вот гипотетическая ситуация, когда вы обрабатываете несуществующий файл, и вы также делаете попытку анализа JSON.

import json
from json.decoder import JSONDecodeError

try:
    with open('something.json') as infile:
        try:
            #data = json.load(infile) # This is what you'd really use
            data = json.loads("{hi: 2}") # But let's make it fail
        except JSONDecodeError:
            print("Not valid JSON, try something else")
            data = infile.read()
except FileNotFoundError:
    print("Can't find file")
    data = ''
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...