UnboundLocalError для локальной переменной с двумя функциями def () - PullRequest
0 голосов
/ 26 февраля 2020

Я получаю сообщение об ошибке:

UnboundLocalError: local variable 'locs' referenced before assignment

В других сообщениях я читал, что решением этой проблемы является использование global locs после определения функции. Однако есть две функции def(), в которых появляется locs =. Я попытался вставить global locs в одну из функций def и запустить, а также запустил код с global locs, определенным в обеих функциях, но в каждом случае получал одну и ту же ошибку.

Трассировка:

Traceback (most recent call last):
  File "model2.py", line 107, in <module>
    main()
  File "model2.py", line 94, in main
    if not locs:
UnboundLocalError: local variable 'locs' referenced before assignment

Соответствующий код :

def extract_features(img_path):
  #  global locs #tried it here and got the same error
    X_img = face_recognition.load_image_file(img_path)
    locs = face_locations(X_img, number_of_times_to_upsample = N_UPSCLAE)
    if len(locs) == 0:
        return None, None
    face_encodings = face_recognition.face_encodings(X_img, known_face_locations=locs)
    return face_encodings, locs

def predict_one_image(img_path, clf, labels):
    #global locs #tried it here with same error
    face_encodings, locs = extract_features(img_path)
    if not face_encodings:
        return None, None
    pred = pd.DataFrame(clf.predict_proba(face_encodings),
                        columns = labels)
    pred = pred.loc[:, COLS]
    return pred, locs

 print("classifying images in {}".format(input_dir))
    for fname in tqdm(os.listdir(input_dir)):
        img_path = os.path.join(input_dir, fname)
        try:
            pred, locs = predict_one_image(img_path, clf, labels)
        except:
            print("Skipping {}".format(img_path))
        if not locs:
            continue
        locs = \
            pd.DataFrame(locs, columns = ['top', 'right', 'bottom', 'left'])
        df = pd.concat([pred, locs], axis=1)

if __name__ == "__main__":
    main()

Я вставляю global locs в неправильном место

1 Ответ

0 голосов
/ 26 февраля 2020

Проблема не в global / local переменных , ни с функциями вообще.

Это просто из-за блока try/except:

        try:
            pred, locs = predict_one_image(img_path, clf, labels)
        except:
            print("Skipping {}".format(img_path))
        if not locs:
            continue

Предположим, что predict_one_image действительно вызывает исключение. Это означает, что ни pred, ни locs не будут определены. После этого блок except просто печатается, а if not locs не работает.

Существует два простых способа исправить это. Или инициализируйте locs в None в случае сбоя вызова:

        try:
            locs = None
            pred, locs = predict_one_image(img_path, clf, labels)
        except:
            print("Skipping {}".format(img_path))
        if not locs:
            continue

Или просто потому, что вы хотите continue, если locs не определено (как я понимаю из кода) вставьте оператор continue в except:

        try:
            pred, locs = predict_one_image(img_path, clf, labels)
        except:
            print("Skipping {}".format(img_path))
            continue
...