2011-03-25 16 views
5

Önceki bir geliştiricinin __init__.py dosyasında kodun büyük bir kısmını yerleştirdiği bir Python projesinde çalışıyorum. Kodu dosyadan bir alt dizindeki yeni bir dosyaya taşımak istiyorum.__İnit__.py dosyasındaki kodun taşınması ancak geriye dönük uyumluluğun korunması

spam/ 
    __init__.py 
    foobar/ 
     __init__.py 
     eggs.py 

Bu nedenle spam modülünü içe aktarmak, kodu foobar/eggs.py dosyasında kullanacaktır.

Geçerli e-posta adresi spam'ini değiştirilemediği için% 100 uyumluluğunu korumak isterim.

cevap

3

% 100 uyumluluk muhtemelen mümkün değildir. Bir şey (turşu gibi) gerçekten bir şeyin nerede tanımlandığıyla ilgileniyor.

Sen __init__.py dosyada classses/fonksiyonları ithal ederek uyumluluk çoğunu alabilirsiniz. spam from foobar import * ekleme

+0

Elbette ki ... Bu işe yarıyor. Bunu neden düşünmediğime emin değilim. Teşekkürler. – user580777

+0

Bahsedilen turşu problemi hakkında biraz daha ayrıntılı bilgi vermek için: eski turşu yeni düzen ile çalışacaktır ('__init __. Py' referans aktarımını göreceklerdir) ancak yeni düzen ile oluşturulan turşu eskiyle kullanılamaz. kodun sürümleri ('spam.foobar' ve içeriği bu sürümlerde bulunmayacaktır). Keyfi sınıfların örneklerini kabul eden diğer serileştirme şemalarının da benzer sorunları olacaktır. – ncoghlan

0

/__ init__.py daha önce olduğunu, aynı kapsamda her şeyi elde etmek için yeterli olmalıdır. Alternatif olarak, adlarını değiştirmek veya dışa aktarılanları kısıtlamanız gerektiğinde, foo = foobar.newfoo gibi aynı dosyada dışa aktarmanız gereken her şeyi yeniden tanımlayabilirsiniz. Tabii

, küresel kapsamda halen herşeyi sahip sorununu bırakır, ancak bunu dışarıdan özdeş bakmak gerekirse bu konuda çok yapamaz. Spam'in __init__.py içinde

0

, yerel olarak foobar.egg şeyler alabilir, daha sonra istenmeyen aktararak herkes hala da istenmeyen __init__ içinde sarıcı fonksiyonlar yazabilir

from foobar.eggs import apples_newname as apples_oldname 
# or (but import * isn't recommended except for extreme cases) 
from foobar.eggs import * 

buna erişebilecektir. belirli durumlarda genişletilmiş uyumluluk için yumurta eşdeğeri olarak adlandırılan pili

import foobar.eggs 
def apples_newname(*args, **kwargs): 
    foobar.eggs.apples_oldname(*args, **kwargs) 
İlgili konular