使用namedtuples作为事实上的const —聪明还是愚蠢? - python

我来自C#,但是现在在Python 3.x中从事大量的科学计算工作,所以我想对我的风格或口音被python标准“怪异”多少有所思考。

特别是,让我无尽的高兴的是,Python中没有const这样的东西。我的用例是这样的:我要保存*.npz文件(数据的numpy序列化字典),传递字典,编写文件等,并且字典键,文件名等需要具有一致,可靠的命名架构。

显然,在8个地方键入相同的魔术愚蠢字符串是错误的。

因此,在我的模块根目录中,我有一个通常称为base.py的文件:

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

元组是不可变的;命名元组具有语义上有意义的索引,现在:

我可以创建多个字典来动态传递数据,但是知道它们的键是什么
我可以写文件,也可以检索具有已知文件名和位置的文件。
重构意味着我只需要在一个地方修改一个魔术字符串即可。
我知道目录在哪里,即使安装了模块也是如此。

在c#中,用Constants填充一个或多个public static const string Foo = "some magic string value";类是非常正常的做法,因此我在这里尝试重新创建。

我目前在namedtuples中有4个这样的base.py,这似乎有太多的边缘了-但我只需要这个。它们在语义上都是不同的-我通过用法关联对常量进行分组。

这是常见的做法吗?

参考方案

它不是。常量的标准约定是仅使用全大写字母的名称来建议值是常量,并将其记录为常量。

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

模块的用户自行修改这些值,风险自负。

如果常量自然地与一个类相关联,则它们可以是类属性,而不是模块级全局变量,但是创建一个仅将此类值分组的类并不常见。

Python:在不更改段落顺序的情况下在文件的每个段落中反向单词? - python

我想通过反转text_in.txt文件中的单词来生成text_out.txt文件,如下所示:text_in.txt具有两段,如下所示:Hello world, I am Here. I am eighteen years old. text_out.txt应该是这样的:Here. am I world, Hello old. years eighteen a…

Python sqlite3数据库已锁定 - python

我在Windows上使用Python 3和sqlite3。我正在开发一个使用数据库存储联系人的小型应用程序。我注意到,如果应用程序被强制关闭(通过错误或通过任务管理器结束),则会收到sqlite3错误(sqlite3.OperationalError:数据库已锁定)。我想这是因为在应用程序关闭之前,我没有正确关闭数据库连接。我已经试过了: connectio…

用大写字母拆分字符串,但忽略AAA Python Regex - python

我的正则表达式:vendor = "MyNameIsJoe. I'mWorkerInAAAinc." ven = re.split(r'(?<=[a-z])[A-Z]|[A-Z](?=[a-z])', vendor) 以大写字母分割字符串,例如:'我的名字是乔。 I'mWorkerInAAAinc”变成…

如何在python中将从PDF提取的文本格式化为json - python

我已经使用pyPDF2提取了一些文本格式的发票PDF。我想将此文本文件转换为仅包含重要关键字和令牌的json文件。输出应该是这样的:#PurchaseOrder {"doctype":"PO", "orderingcompany":"Demo Company", "su…

查找字符串中的行数 - python

我正在创建一个python电影播放器​​/制作器,我想在多行字符串中找到行数。我想知道是否有任何内置函数或可以编写代码的函数来做到这一点:x = """ line1 line2 """ getLines(x) python大神给出的解决方案 如果换行符是'\n',则nlines …