/ / Jaki jest elegancki / Pythoński sposób utrzymywania zmiennych w zasięgu, a jednocześnie wychwytywania wyjątków? - python, python-2.7

Jaki jest elegancki / Pythonic sposób na zachowanie zmiennych w zakresie, ale także łapać wyjątki? - python, python-2.7

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 № 1

Masz 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.