2013-03-07 10 views
9

doğrudur:Python'un belgelerinde hata var mı? Aşağıdaki eğer <a href="http://docs.python.org/2/tutorial/modules.html#more-on-modules">http://docs.python.org/2/tutorial/modules.html#more-on-modules</a> okuma ve merak ediyorum

Modüller diğer modülleri yükleyebilirler. Bu, alışılagelmiş ancak için tüm içe aktarma ifadelerini bir modülün başlangıcına (veya komut dosyası, bu konu için ) yerleştirmek için gerekli değildir. İçe aktarılan modül adları, alma modülünün global simge tablosuna yerleştirilir.

Görünüşe değil:

>>> def foo(): import sys 
... 
>>> foo() 
>>> sys.path 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'sys' is not defined 

bir online demo için http://ideone.com/cLK09v bakınız.

Yani, Python'un belgelerinde bir hata olduğunu veya bir şey anlamıyorum?

+2

Bu konuda http://bugs.python.org adresinden bildirebilirsiniz. –

+0

@AshwiniChaudhary Bitti: http://bugs.python.org/issue17383 – piokuc

cevap

12

Evet, bu bir belge hatadır. import deyimi, adları geçerli ad alanına alır. Genellikle import, işlevlerin ve sınıfların dışında kullanılır, ancak keşfettiğiniz gibi, bunların içinde çalışır. Örnek işlevinizde, işlev çağrıldığında modül işlevin yerel ad alanına alınır. (Eğer yapmadım Hangi, ama bu yine de işlevin dışında kullanılabilir hale olmaz.)

global kelime Ancak burada çalışıyor mu:

def foo(): 
    global sys 
    import sys 

foo() 
sys.path 
0

ben bu aslında sanmıyorum belgelerindeki bir hata, ancak daha çok yanlış yorumlama. Sadece bir kapsam sorunu var. Bunu foo() işlevi kapsamında içe aktarıyorsunuz. Dokümantasyonun önerdiği gibi yapabilir ve ithalatı dosyanın alt kısmına ya da dosyada hala modülünüzle aynı genel kapsama sahip olabilecek başka bir yere koyabilirsiniz. Sorun, "İçe aktarılan modül adları, içe aktarma modülünün global simge tablosuna yerleştirilir". Burada, içe aktardığınız modülün kapsamı, modülün genel düzeyinde değil, foo() işlevinde bulunur.