2013-05-22 28 views
5

Şirketimizden ayrılan geliştiriciden bir proje aldım. Çok karmaşık değil, ama çok hoş görünmüyor. Yani soru şu: Uygulama bazı modülleri içeriyor ve bir tanesi de uygulamayı saklayan "ayarlar". seçenekler (tüm olası seçenekler değil, sadece iki tane söyleyelim: foo ve bar). uygulama o komut satırında (kullanarak argparse) den seçenekleri okur başlatıldığında:Uygulama ayarları modüllerde nasıl depolanır

parser.add_argument('--foo', action='store_true') 
parser.add_argument('--bar', action='store_true') 
parser.add_argument('--baz', action='store_true') 

Ve sonra bu pis şeyi gerçekleştirir: olmayan pythonic hack bu kirli olduğunu düşünüyorum:

for name, val in parser.parse_args(sys.argv[1:])._get_kwargs(): 
    setattr(sys.modules['settings'], name, val) 

İlk . Ve ikincisi, bu tür bir kodu kullanması sakıncalı bir durumdur, çünkü settings.baz'u kullanmam gerektiğinde, IDE mevcut olmadığını bildirir. Bu kesmenin amacı, uygulamada kullanılan tüm modüllerde bulunan komut satırından ayrıştırılan seçenekleri yapmaktır.

Tekil desen gibi bir şey düşünüyorum, ancak PHP'de bir kez kullandım ve python'da bu doğru çözümü bilmiyorum. Ve olsa bile, birisi örnek gösterebilir mi?

Python ve SO üzerinde noob değilim, lütfen bana iyi davranın :) Teşekkürler.

Not; Ben tekil nesnelerdir İngilizcem

+0

Bu bir kopyadır. Bu konuyla ilgili olarak http://stackoverflow.com/questions/15992387/python-settings-file –

+9

yanıtı bu değildi. Bu bir çoğaltma değil - diğeri yapılandırma dosyaları hakkında, bu bir çalışma zamanı modülü yapılandırması hakkında. –

cevap

4

Modüller olası hatalar için üzgünüm ve bir olurdu diğer modüller tarafından kullanılan ayarları saklamak için birini kullanarak Çok Pythonic

"Kötü şeyler" in ikinci satırı sadece settings adında bir modülün özniteliklerini ayarlıyor ve bu yüzden o kadar da kötü değil. Daha da kötüsü, komut satırından ayrıştırılan ayarların adlarını ve değerlerini almak için parser.parse_args() tarafından döndürülen argparse.Namespace nesnesinin özel bir özelliğine erişen ilk satırın _get_kwargs() bölümüdür. IDE dinamik olarak eklenen ayarların adını bilmediği için

import settings # possibly empty .py file 

for name, val in vars(parser.parse_args(sys.argv[1:])).iteritems(): 
    setattr(settings, name, val) 

Ancak bu IDE sorunları gidermek olmaz: bunu yapmak için bir miktar daha iyi bir yolu böyle bir şey olabilir. Bunu düzeltmenin basit bir yolu, settings.py modülünde bir boş değer yerine tüm olası özniteliklerin varsayılan değerlerle tanımlanmasıdır. Bu anahtar ve bir değer olarak types.ModuleType bir örneği olarak adı ile sys.modules sözlüğe eklenir için

bir modül import ilk kez bir giriş ed. Sonraki import s önce bunun için bir giriş olup olmadığını kontrol edecek ve eğer varsa, dosyayı yeniden yüklemeyi atlayacak - bu yüzden temelde tekil nesneler olduklarını iddia ediyorum. Özniteliklerinde yapılan değişiklikler hemen içe aktarılan veya daha sonra gerçekleştiren diğer modüller tarafından görülebilir, bu nedenle genellikle bir uygulama içinde iyi bir veri paylaşım mekanizmasıdır.

+1

Aradığım şey bu. Ayrıca, bu [link] 'i (http://docs.python.org/2/faq/programming.html#how-do-i-share-global-variables-across-modules) buldum. "Kötü şey" ile ilgili olarak - haklısınız, en kafa karıştırıcı şey özel yöntemin kullanımıydı. Vars ile ilgili ipucu için teşekkürler. Ve elbette tüm bunların nasıl çalıştığına dair detaylı açıklama için teşekkür ederim. – user2410235

+0

SSS'deki bu modül kullanımını açıkça belgelediklerini görmek güzel. Sys.modules'ın amacı bir modül önbellekleme mekanizması sağlamak olsa da, uygulama bunları uygulama içindeki modüller arasında veri alışverişi için çok uygun hale getirmektedir. – martineau

+1

FWIW Ayrıca [Genel değişkenleri modüller arasında nasıl paylaşırım?] Başlıklı bir bölüm de var. (Https://docs.python.org/3/faq/programming.html#how-do-i-share-global-variables-across -modules) mevcut Python 3 belgelerinde aynı tavsiyeye sahip (bu tür şeyleri yapmak için "kanonik" olarak adlandırın). – martineau

0
+1

Evet, bu modülü gördüm, ancak ihtiyaç duyduğumdan daha serin bir yapılandırma formatı. Aslında, uygulama, uygulamadaki tüm modüllerde konfigürasyonun nasıl paylaşılacağıdır. Bu seçenek yapılandırma dosyasından veya komut satırından olursa olsun. Muhtemelen kanıtlanmış şeyleri göremiyorum ve bu modülde ihtiyacım olan şeyler var, ama lütfen not edin, pythonda (ve programlamada çok fazla tecrübem yok). Benim durumumda nasıl kullanacağımı gösterebilirseniz, bu iyi olurdu. – user2410235

İlgili konular