2016-03-29 4 views
1

Ich komme von einem C# -Hintergrund, aber jetzt mache ich eine Menge wissenschaftliche Computing-Arbeit in Python 3.x, also hätte ich gerne ein paar Gedanken darüber, wie sehr mein Stil oder Akzent nach Python-Standards "seltsam" ist.mit nameduples de facto - clever oder dumm?

Insbesondere gallt es mir zu keinem Ende, dass es so etwas wie const in Python nicht gibt. Mein Anwendungsfall ist folgendes: Ich speichere *.npz Dateien (numme serialisierte Datenwörterbücher), lege Diktate ab, schreibe Dateien usw. und die Wörterbuchschlüssel, Dateinamen usw. müssen ein konsistentes, zuverlässiges Namensschema haben.

Es ist klar, dass das Tippen der gleichen magischen dummen Schnur an 8 Stellen falsch ist.

Also in meinem Modul Wurzel, habe ich eine Datei normalerweise base.py Ich nenne:

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__)) 

Tupeln sind unveränderlich; genannt Tupel hat semantisch sinnvolle indicies, und jetzt:

  • kann ich mehrere Wörterbücher erstellen Daten on the fly passieren, aber weiß, was ihre Schlüssel
  • sind, kann ich schreiben Dateien mit und Abrufen von Dateien mit bekannten Dateinamen und Orte.
  • Refactoring bedeutet, ich muss nur eine magische Saite an einer Stelle ändern.
  • Ich weiß, wo meine Verzeichnisse sind, auch wenn das Modul installiert ist.

In C#, es ist ziemlich üblich, eine oder mehr Constants Klasse mit public static const string Foo = "some magic string value"; gefüllt zu haben, so dass das, was ich versucht habe hier neu zu erstellen.

Ich habe derzeit 4 solche namedtuples in base.py, die wie es scheint am Rande der zu viele - aber ich brauche nicht mehr als diese. Sie sind alle semantisch verschieden - ich gruppiere Konstanten nach Nutzungsassoziation.

Ist diese allgemeine Praxis?

+0

Es ist nicht üblich. Auch ungewöhnlich, aber möglicherweise von Interesse, siehe Frage [_Kann ich verhindern, ein Objekt in Python zu modifizieren? _] (Http://stackoverflow.com/questions/3711657/cani-i-prevent-modifying-an-object-in-python) – martineau

Antwort

1

Es ist nicht. Die Standardkonvention für Konstanten besteht darin, nur Großbuchstaben zu verwenden, um darauf hinzuweisen, dass der Wert konstant ist, und Dokument sie als Konstante.

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

Der Benutzer Ihres Moduls ändert diese Werte auf eigenes Risiko.

Wenn die Konstanten einer Klasse natürlich zugeordnet sind, können sie Klassenattribute anstelle von Globalen auf Modulebene sein. Es ist jedoch nicht üblich, eine Klasse nur zu erstellen, um solche Werte zu gruppieren.

+0

Ich habe keine Klasse genau erstellt, aber ich habe alle meine globalen Konstanten in eine Datei gruppiert. Für diese Anwendung bin ich mein eigener primärer Benutzer - aber ich habe, wie ziemlich offensichtlich sein sollte, einige Restaufhängungen über das Erklären von Strings. – gvoysey

Verwandte Themen