Return ifadeleriyle Garip-Başka-Hariç-Sonunda Deneyin davranışı


91

Bu, tuhaf davranan bir koddur. Bu, yazdığım davranışın basitleştirilmiş bir versiyonu. Bu yine de tuhaf davranışı gösterecek ve bunun neden olduğuna dair bazı spesifik sorularım var.

Windows 7'de Python 2.6.6 kullanıyorum.

def demo1():
    try:
        raise RuntimeError,"To Force Issue"
    except:
        return 1
    else:
        return 2
    finally:
        return 3

def demo2():
    try:
        try:
            raise RuntimeError,"To Force Issue"
        except:
            return 1
        else:
            return 2
        finally:
            return 3
    except:
        print 4
    else:
        print 5
    finally:
        print 6

Sonuçlar:

>>> print demo1()
3
>>> print demo2()
6
3
  • Demo 1 neden 1 yerine 3 döndürüyor?
  • Demo neden 6 w / 4 veya 5 basmak yerine iki baskı yapıyor?

Yanıtlar:


128

Çünkü finallyifadelerin yürütülmesi garantilidir (elektrik kesintisi olmadığı veya Python'un kontrolü dışında herhangi bir şey olmadığı varsayılırsa). Bu, işlevin geri dönebilmesi için, farklı bir değer döndüren final bloğunu çalıştırması gerektiği anlamına gelir.

Python dokümanlar durumu:

Bir try… final ifadesinin try takımında bir return, break veya continue ifadesi yürütüldüğünde, final cümlesi de 'yolda' çalıştırılır.

Bir fonksiyonun dönüş değeri, çalıştırılan son dönüş ifadesiyle belirlenir. Nihayet yan tümcesi her zaman yürütüldüğünden, final yan tümcesinde çalıştırılan bir return ifadesi her zaman en son çalıştırılan olacaktır:

Bu, geri dönmeye çalıştığınızda, finallybloğun çağrıldığı ve sahip olacağınızdan ziyade onun değerini döndürdüğü anlamına gelir .


4
İkinci örnekteki 5 neden basılmıyor? bu hala iyi açıklanmadı sanırım. geri dönen cevap iyi ama neden ikinci örnekteki 5 basılmıyor
Joran Beasley

5
ah ben nihayet dış hemen atlamak için neden olur, ilk denemede dönüş dışarı çözdüm
Joran Beasley

2
Kesinlikle, çünkü finallybloklar her zaman çalışır.
Gareth Latty

2
Demo iki'de, niçin nihayet yuvalanmış olanı çalıştırıyor, sonunda dışarıya fırlatıyor, sonra geri dönüşü bitirmek için nihayetinde hiçbiri dışarıdan geri döndürmek yerine nihayet yuvaya geri dönüyor?
Kyle Owens

1
Çünkü returnifade çağrıldığında, Python finallyçalıştırılması gereken açık cümleleri kontrol eder (yukarıdaki alıntıya bakın).
Gareth Latty

7

Yürütme emri:

  1. tüm normal tamamlananları engellemeyi dene -> sonunda engelle -> fonksiyon biter
  2. çalıştırmayı deneyin ve istisna A'ya girin -> sonunda blok -> fonksiyon biter
  3. bloğu dene bir dönüş değeri oluştur ve dönüşü çağır -> sonunda engelle -> açılır pencere dönüş değeri -> fonksiyon biter

Bu nedenle, final bloğundaki herhangi bir dönüş, adımları önceden sona erdirecektir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.