2012-06-20 18 views
25

Yığın taşma üzerine ilk kez kullanıcı ve burada olduğum için heyecanlıyım.Python - Sabit listeleri veya sözlükleri tanımlamak için en iyi/en temiz yol

INTRO: Son zamanlarda büyülü serüvene Python programlama dünyasına adım atmıştım - bunu seviyorum. Şimdi her şey, C'den garip geçişimde sorunsuz bir şekilde gitti, fakat HEADER dosyasına (.h) eşanlamlı olan bir şey yaratmakta zorlanıyorum.

SORUN: Orta boyutlu sözlüklerim ve listelerim (yaklaşık 1000 öğe), uzun numaralar ve '#defines' (gerçekten de değil) var, ancak hepsini organize etmenin TEMİZ bir yolunu bulamıyorum. C'de hepsini bir başlık dosyasında atacağım ve bir daha asla düşünmeyeceğim, ancak Python'da bu mümkün değil.

GÜNCEL KİRLİ ÇÖZÜM: MODÜL veya FONKSİYONLAR'ın en üstündeki tüm CONSTANT değişkenlerini başlatıyorum (çoklu işlevler gerekiyorsa modül). SONUÇ: Birilerinin sürekli değişkeni düzenlemek için bir yol bulması durumunda sonsuza dek minnettar olurdum.

TEŞEKKÜR EDERİZ!

+6

Sadece söylemek istedim, Stack'a hoş geldiniz, ve burada iyi organize edilmiş bir soruyla başladığınız için teşekkürler! – jdi

cevap

19

kendi modülüne içine sabitleri koyun:

# constants.py 

RED = 1 
BLUE = 2 
GREEN = 3 

Sonra bu modülü ithalat ve sabitleri kullanın:

import constants 

print "RED is", constants.RED 

sabitleri istediğiniz herhangi bir değer olabilir, burada tamsayı gösterilen ettik ancak listeler ve dikteler aynı şekilde çalışır. Genellikle

+0

Harika bir fikir. Gecikme veya verimlilik kaybının nasıl olduğunu biliyor musunuz? Teknik olarak içe aktardığınız için ve değeri her seferinde referans almanız gerekmediğinden mi? – TSmith

+0

Her seferinde bir öznitelik araması yapıyorsunuz, bu zaten her zaman gerçekleşen işlem türüdür, gerçekten endişelenecek bir şey değildir. –

+1

@TSmith: Ve eğer biraz zaman kaybetmeden endişe ediyorsanız, sürekli olarak "RED 'i ithal eden sabitlerden" yapabilir ya da süper uzun döngüden hemen önce bir değişkene atayabilirsiniz: red = constants.KIRMIZI – jdi

9

yapmam bu:

Dosya: constants.py

CONSTANT1 = 'asd' 
CONSTANT_FOO = 123 
CONSTANT_BAR = [1, 2, 5] 

Dosya: your_script.py

from constants import CONSTANT1, CONSTANT_FOO 
# or if you want *all* of them 
# from constants import * 

... 

Şimdi sabitler bir dosya ve sizin içindedir güzelce ithal edebilir ve kullanabilirler. constants.py Ayrı bir dosya oluşturun ve tüm dünya ile ilgili sabitleri buraya yerleştirin.

+0

Teşekkür ederim, CC size yardımcı olacaksanız, verimlilik sorusuna yanıt verin. – TSmith

+0

Hepsini içe aktarırsanız, sabitler genel değişkenler olur ve arama gerektirmez. Python'un C'den 200 kat daha yavaş olduğunu not edin, böylece mikro optimizasyon yapmaya çalışırsanız bir hız artışına dikkat edin. – Blender

+0

Teşekkür ederim blender. Hızlı bir merak sorusu, yerel değişkene (bir işlev içinde) o ithal edilen global değişkeni atarsam, yerel varlığın bir kopyasına veya global referansa sahip olması gerekir mi? – TSmith

2

Daha sonra,, constants.SPAM olarak başvuruda bulunabilirsiniz ya da (sorgulanabilir) from constants import *'u sadece SPAM veya EGGS olarak anlayabilirsiniz.

Buradayken, Python'un sabit sabitlerini desteklemediğini unutmayın. Sözleşme, sadece onları ALL_CAPS olarak adlandırmak ve bunları değiştirmemek için söz veriyorum.

+0

Haha evet ben söz veriyorum :), ama çalışma süresi verimliliği ne olacak? Bir modülü içe aktardığınızda C dilinde "__inline" gibi bir şey var mı? – TSmith

+0

@TSmith: Bir satır içi ile karşılaştırırdım, çünkü gerçekten bir isim-alanı modülü nesnesine içe aktarılıyor ve bunu sadece bir kez yapıyor ve sonraki ithalatlar için bellekte paylaşıyor. – jdi

+0

Evet, bu konu hakkında düşündüğüm aptalca bir soruydu. Teşekkürler ve iyi günler! – TSmith

İlgili konular