Używam Pythona od kilku miesięcy i do tej pory go uwielbiam. Podoba mi się również to, że zazwyczaj istnieje jeden „Pythoński” sposób rozwiązywania typowych problemów programistycznych.
W kodzie piszę, ponieważ wykonuję wywołania funkcji sieciowych i muszę obsługiwać wyjątki, ciągle napotykam ten szablon, który w końcu piszę:
proxyTest = None
try:
proxyTest = isProxyWorking(proxy)
except TimeoutError:
break
if proxyTest:
...
To jest mój sposób na zadeklarowanie proxyTest, aby tak byłojest objęty zakresem, gdy muszę go użyć, ale również wywołuje funkcję, która zwróci jej wartość wewnątrz odpowiedniej struktury obsługi wyjątków. Jeśli zadeklaruję proxyTest w bloku try, będzie on poza zakresem dla reszty mojego programu.
Czuję, że musi istnieć bardziej elegancki sposób na poradzenie sobie z tym, ale nie jestem pewien. Jakieś sugestie?
Odpowiedzi:
6 dla odpowiedzi № 1Masz kilka lepszych opcji, kontynuuj kontrolę przepływu w else
blok:
try:
proxyTest = isProxyWorking(proxy)
except TimeoutError:
break
else:
#proxyTest is guaranteed to be bound here
Lub obsłużyć przypadek awarii w bloku oprócz.
try:
proxyTest = isProxyWorking(proxy)
except TimeoutError:
proxyTest = None
#proxyTest is guaranteed to be bound here
Myślę, że cokolwiek jest lepsze, zależy od kontekstu.
5 dla odpowiedzi nr 2
Oczywistą alternatywą byłoby wykonanie „fałszywej” inicjalizacji w except
blok:
try:
proxyTest = isProxyWorking(proxy)
except TimeoutError:
proxyTest = None
To, czy jest to łatwiejsze / bardziej odpowiednie niż twoje konstrukcje, zależy od tego, jak skomplikowana jest logika w środku.
-1 dla odpowiedzi nr 3
Położyłbym kod
if proxyTest:
w bloku try, zaraz po powiązaniu proxyTest.