#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!")