2016-03-29 16 views
1

C# arka planından geliyorum ama şimdi Python 3.x'te saygın bir miktarda bilimsel bilgi işlem işi yapıyorum, bu yüzden stilimin veya aksamın python standartlarına göre ne kadar "garip" olduğuna dair bazı fikirler istiyorum. Özellikle, Python'da const diye bir şey olmadığı sonucuna varmamı sağlıyorum. Kullanım durumum şudur: *.npz dosyalarını (numpy seri hale getirilmiş sözlükler) kaydetme, dikteleme, dosya yazma, vb. Aktarma ve sözlük anahtarları, dosya adları vb. Tutarlı, güvenilir bir adlandırma şemasına sahip olmamız gerekir.- akıllı mı yoksa aptal mı?

8 dilde aynı sihirli aptal dizeyi yazmak yanlıştır.

Yani benim modül kök i normalde base.py dediğimiz bir dosya var:

import os 
from collections import namedtuple 
from os import path 

# This is the tuple that contains operational constants 
RuntimeConstants = namedtuple("Const", " ModelDirectoryLabelName \ 
            DefaultModelOutputDirectoryRoot \ 
            ResultDirectoryNameFormat \ 
            PeripheryOutputFilePrefix \ 
            NCOutputFilePrefix \ 
            SummaryPlotFileName \ 
            PeripheryConfigurationName \ 
            ResourceDirectoryName \ 
            StimulusTemplateName") 

runtime_consts = RuntimeConstants(ModelDirectoryLabelName=".model-output-root", 
            DefaultModelOutputDirectoryRoot="model-output", 
            ResultDirectoryNameFormat="%d %b %y - %H%M", 
            PeripheryOutputFilePrefix="periphery-output-", 
            NCOutputFilePrefix="nc-output-", 
            PeripheryConfigurationName="simulation-configuration.yaml", 
            SummaryPlotFileName="summary-plots.pdf", 
            ResourceDirectoryName="resources", 
            StimulusTemplateName="default_stimulus.yaml" 
           ) 
# This is the path of __this file__, which we can then base location on 
rootPath = os.path.dirname(os.path.abspath(__file__)) 

Tuples değişmez olan, adlandırılmış küpe şimdi semantik olarak anlamlı indicies ve sahiptirler:

  • ben anında veri aktarmak için birden fazla sözlükleri oluşturmak, ama onların tuşları ile
  • yazabilirim dosyalardır biliyor ve Bilinen dosya adları ile dosyaları alabilirsiniz ve yerleri.
  • Refactoring aracı Sadece bir sihirbazı tek bir yerde değiştirmek zorundayım.
  • Modüllerim kurulduğunda bile dizinlerimin yerini biliyorum. c In #

, bir veya daha fazla Constants sınıf public static const string Foo = "some magic string value"; ile dolu olması oldukça normal bir uygulamadır, böylece burada yeniden çalıştığım buydu.

Şu anda base.py numaralı 412 gibi namedtuples ürünüm var, bu çok fazla sahip olmanın sınırında gibi görünüyor - ama bundan daha fazlasına ihtiyacım yok. Hepsi anlamsal olarak farklılar - kullanım derneği tarafından sabit grupları gruplandırdım.

Bu yaygın ish uygulaması mıdır?

+0

Yaygın değil. Ayrıca nadir fakat ilgi çekici bir konuya bakınız. [_Can Python'da bir nesneyi değiştirmeyi engelleyebilir miyim? _] (Http://stackoverflow.com/questions/3711657/can-i-prevent-modifying-an-object-in-python) – martineau

cevap

1

Değil. Sabitler için standart kural, değerin sabit olduğunu ve belgesini sabit olarak belirtmek için yalnızca tüm-büyük harf adlarını kullanmaktır.

MODEL_DIRECTORY_LABEL_NAME = ".model-output-root" 
DEFAULT_MODEL_OUTPUT_DIRECTORY_ROOT = "model-output" 
# etc 

Modülünüzün kullanıcısı, bu değerleri kendi riskiyle değiştirir.

Sabitler bir sınıfla doğal olarak ilişkilendirilmişse, bunlar modül düzeyi globals yerine sınıf öznitelikleri olabilir, ancak bu değerleri gruplamak için sadece sınıfı oluşturmak yaygın değildir.

+0

Tam olarak bir sınıf oluşturmadım, ancak tüm global sabitlerimi tek bir dosyada gruplandırdım. Bu uygulama için, kendi birincil kullanıcımım - ama oldukça açık olması gerektiği gibi, sadece dizeleri bildirmekle ilgili bazı kalıcı eklentilerim var. – gvoysey