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?
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