2011-09-14 9 views
11

Ben diskte aşağıdaki yapıda bir paket geliştiriyorum:Python paketlerimde ad alanı çakışmalarını standart kitaplık paketi adlarıyla nasıl çözerim?

foo/ 
    __init__.py 
    xml.py 
    bar.py 
    moo.py 

xml.py paketi SAX akışı ayrıştırıcı kullanan diğer paket bileşenleri için bazı özel XML ayrıştırma ve çevirisini yapan bir sınıf sağlar.

import xml.sax 
import xml.sax.handler 

Ama bir uygulamada kullanmaya gittiğimde olsun: Yani onun içinde vardır

Traceback (most recent call last): 
    File "testxmlparser.py", line 15, in <module> 
    import foo.xml 
    File "~/code/foo/xml.py", line 39, in <module> 
    import xml.sax 
ImportError: No module named sax 

Bir ad çakışması var görünüyor. xml.py'u xmlparser.py gibi başka bir şeye yeniden adlandırırsam her şey beklendiği gibi çalışır. Ama bu yanlış bir şey gibi hissettiriyor. Python'da paket isimleri ve çözümü hakkında temel bir şey eksik gibi hissediyorum.

foo/xml.py dosyasını yeniden adlandırmayla ilgili olmayan bu işi yapmak için uygun bir yol var mı? Yoksa çelişen isimlere gerçekten tek çözüm bu mu?

Düzenleme: "Standart Python modülleriyle aynı şeyleri adlandırmaktan kaçının" ... sanki bana bir mineshaft görünüyor. Değişen ve zamanla büyüyecek olan, standart modül seti olan hareketli bir hedeftir. Yani 'u gerçekten adında yaratıcılığınız olmadıkça, isminizle yeniden adlandırılan şeyleri yeniden adlandırın. Ayrıca, ben zaten foo (foo kullanmıyorum, ama kesinlikle benzersiz bir şey) ile benzersiz bir paket adı var, bu yeterli olmamalıdır?

cevap

13

olarak

from __future__ import absolute_import 

kullanmak ve gerekirse relative imports kullanın over here bahsetti.

+0

Sorun, xml.sax'ın * benim * paketimde olmamasıdır. Yani göreli bir ithalatı işe yaramıyor. Bu aslında şu anda benim için başarısız oluyor. Python 'xml.sax''nın' foo.xml' paketime göreceli olmasını bekler, ama değil. –

+0

Tam olarak peşindeydim. Teşekkürler! –