Python попробуйте, за исключением случаев, когда список равен нулю

#python-3.x #list #try-catch #rsa #sympy

#python-3.x #Список #попробуйте-поймайте #rsa #симпатичный

Вопрос:

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

 try:
    sol = solve([eq1,eq2],[r,s])

    rB = bin(abs(sol[0][0]))
    sB = bin(abs(sol[0][1]))
    stop = True
    r = rB[2:len(rB)]
    s = sB[2:len(sB)]
    P = int("0b" r s,2)
    Q = int("0b" s r,2)
    print(P*Q == pubKey.n)
    print("P = {}".format(P))
    print("Q = {}".format(Q))
    break
except ValueError:
    pass
 

Чего я хочу:
если solve() возвращает пустой список, просто передайте. И если функция solve() возвращает полный список, продолжайте выполнение. Решение будет возвращать пустой список, пока я не найду правильное значение.
Этого можно достичь, проверив sol[0][0], если есть непустой список, это сработает, но если список пуст, это выдаст ошибку (нулевой указатель), я хочу попробовать пометить ее и передать.

Сейчас у меня возникает то, что, когда sol пуст, он пытается получить sol[0][0], и ofc это выдает ошибку, которая не улавливается при попытке, и весь код останавливается. Кто-нибудь знает решение для этого? Я неправильно использую try?

Комментарии:

1. Вы могли бы проверить вывод решения подобным if sol == [] образом.

Ответ №1:

Установите sol в начале каждого цикла на некоторое значение и проверьте его в предложении except

о нас else

try/except имеет else , который будет запущен try , блок не вызвал исключения

и for имеет else предложение для случаев, когда он не был вырван из!

 for foo in iterable:
    # set value so the name will be available
    # can be set prior to the loop, but this clears it on each iteration
    # which seems more desirable for your case
    sol = None
    try:
        "logic here"
    except Exception:
        if isinstance(sol, list):
            "case where sol is a list and not None"
        # pass is implied
    else:  # did not raise an Exception
        break
else:  # did not break out of for loop
    raise Exception("for loop was not broken out of!")