2012-09-07 12 views
20

, sen sonunda göreceksiniz:Python: `Bir modülde izin verilmez return` nedeninden modüllerden derlenen Python bayt bakarsak

10 LOAD_CONST    0 (None) 
13 RETURN_VALUE   

yani Bir return, bir modülün kök seviyesinde mükemmel şekilde geçerlidir. Ancak, kaynak kodda kullanmaya çalışırsanız, aşağıdakileri elde edersiniz:

SyntaxError: 'return' outside function 

Neden?


Bu elbette bir dil tasarımı kararıdır. Ama neden alındı? Bir modülde return genellikle oldukça kullanışlıdır. Örneğin. Bazen bir modülün başında bu kodu yazmak istiyorum:

import sys 
if sys.platform != "linux2": 
    print "your platform is not yet supported" 
    # define some stubs 
    def foo(): pass 
    def bar(): pass 
    return 

Ve (ben istemiyorum modül değil yükleme neden olur çünkü) orada bir istisna yükseltmek istemiyoruz.


Aslında anında Python bytecode manipüle ve sadece geri dönüşü yapmak (ya da iade yapılır sonuna kadar benim durumda atlamada) hangi birlikte bazı kodlar sızdı. Bu çalışıyor. Sadece CPython'un tek nedeni, bir kod nesnesini işlemek için standart bir yol olmamasıdır. Kod,

Here kodudur. olası cevapları için


: Ben gerçek kanıt tercih ediyorum, bu konuda ya da öylesine Guido van Rossum bazı geçmiş tablolar, çok değil sadece herhangi bir rasgele tartışması. Tabi ki bu, hem avantajlar (hem de sunulanlar gibi) ve dezavantajlarım olabilir ama ben buna karşı büyük bir sebep görmüyorum.

+2

neden bir istisna oluşturmadınız? Bu, yürütmeyi durdurup istisnai durumun dinlenmesi için arayanın neden olduğu hakkında bilgi döndürür. –

+1

@JoranBeasley: Modülü yüklemez. Hala modülü yüklemek istediğim durumlar hakkında konuşuyorum. – Albert

+1

daha sonra kullanıcının alabileceği ayrı bir modül var ... eğer desteklenmiyorsa desteklenmemesi gerekiyorsa ... '__init __. Py' yapabilmeniz için şunu deneyin: import no_linux2; hariç: no_linux2' –

cevap

6

Bu bir python devs bölümü için bir karar olduğunu tahmin ediyorum çünkü modülün geliştiricilerini almak yerine, modülünün kullanıcı kullanıcı tarafından desteklenmemesi için zorlar. ne olacağını tahmin etmek için). Bir windows makinesinde kodu çalıştırdıklarında onların sürprizlerini düşünün ve aniden module.foo() bekledikleri gibi çalışmıyor. (Sizin uyarınız print ifadesi, stdout'a boşaltılabilecek her türlü başka çöp kutusuna tamamen gömülebilir).

Bunu işlemenin en çirkin yolu, bir ImportError veya NotImplementedError yükseltmektir. Daha sonra kullanıcısı, bu modül olmadan yaşayabileceklerine ve devam edebileceklerine (istisnaları yakalayarak) veya programlarının orada çarpıp yanmaya başlamasına karar verebilir.

+1

Tek bir geçerli neden düşünemiyorum neden bir modülden bir geri dönüşü çağırmak istiyorum ... –

+0

Bu genellikle zorlamayan Python için oldukça sıradışı çok (tam tersi). – Albert

+0

@Albert - bu da * zorlamaz. Eğer hissediyorsanız, tüm modülünüzü “if-elif-else” maddesine dahil etmekte özgürsünüz. Küçük bir modül için (dediğiniz gibi) bu bir seçenek olabilir ... – mgilson