【问题标题】:Where to put constants, parameters, etc. in Python code for research? [closed]在 Python 代码中将常量、参数等放在哪里进行研究? [关闭]
【发布时间】:2014-08-29 09:37:02
【问题描述】:

背景:我目前正在实施一些环境过程的预测模型。如果您愿意,可以想象一个模型可以计算某些生态系统对不同温度的反应。

这是我第一次在 Python 中做这样的事情,我对如何组织我的文件有点了解。我已阅读相关问题,但它们似乎大多是关于不同的用例和/或处理更深入的问题,而不是关于将常量、参数等放在哪里。

给你一个我现在拥有的例子:

常量.py:

# these should never be touched
CONST1 = 1
CONST2 = 2
# etc

parameters.py:

# these can and should be changed by the user
par1 = 1
par2 = 2
par3 = 3
# etc

模型.py:

# here are the model's functions
import constants as c

def fun1(par1, par2):
    res1 = c.CONST1 * par1 + par2
    return res1

def fun2(par2, par3):
    res2 = c.CONST2 * par2 + par3
    return res2
# etc

main.py:

# this file is used to run the model
import model as m
import parameters as p

res1 = m.fun1(p.par1, p.par2)
res2 = m.fun2(p.par2, p.par3)
# plot results etc

像这样将常量、参数和函数保存在单独的文件中是个好主意吗,或者至少这些常量应该是 model.py 中的全局变量,因为无论如何我都不碰它们?单文件解决方案(常量、参数、模型和一个 .py 中的主函数)的“极端情况”是否被认为是不好的风格?几乎任何函数都使用的变量(例如时间,或者我在 model.py 中导入的常量)呢?我应该明确地将它们传递给每个函数,还是可以/应该将它们设为全局变量?

TL;DR:如果有任何关于如何组织这样的项目的最佳实践,请帮助新手程序员。

【问题讨论】:

  • 这个问题的答案没有对错之分,随着项目的发展,人们的需求也会有所不同,但在我看来,分离可以更容易地找到要更改的内容。我通常每个包都有一个 constants.py(每个文件夹都包含一个 init.py)。
  • 你可以看看其他科学包是怎么做的——例如,numpy 是开源的,所以你可以看到他们的代码:github.com/numpy/numpy
  • 因为这实际上取决于项目以及代码的使用方式,所以没有一刀切的答案。

标签: python code-organization


【解决方案1】:

这个问题主要是基于意见的,但我会试一试。

如果您不想让用户访问常量,而只允许访问参数,那么您做的非常正确(常量一个文件,参数一个单独的文件)。

如果您不介意用户能够更改常量,我建议您使用一个名为 settings.py 的文件,您可以从该文件中导入常量等等。请记住,Python 允许选择性导入,这意味着如果您在一个 .py 文件中只需要 1 个常量,则可以导入该单个常量,因此这不是效率问题。除非项目很小,否则我不会将所有常量保存在一个文件中。

除此之外,我还建议您将特定于模型的变量/常量作为静态属性存储在模型类中。例如,我们可以这样定义一个学校成绩模型:

class GradeModel(BaseModel):
    GRADE_TYPES = (
        (1, 'Exam'),
        (2, 'Final Paper'),
    ) # this is just an example

    id = IntFieldType()
    student_id = IntFieldType()
    type = ChoiceType(choices=GRADE_TYPES)
    value = IntFieldType()

这样,您可以将成绩类型常量称为GradeModel.GRADE_TYPES。请注意,上面的代码更像是伪代码,因为模型主要取决于您使用的框架/库,但您了解它的要点。

【讨论】:

  • “模型”层的概念并不意味着任何框架/库/“BaseModel”类或其他任何东西,它只是将代码的核心功能(域)与正交关注点,如表示、UI、持久性等。
  • 我的意思是如果您使用库/框架,模型的定义取决于您使用的内容。
猜你喜欢
  • 1970-01-01
  • 2015-12-20
  • 1970-01-01
  • 2012-08-30
  • 1970-01-01
  • 1970-01-01
  • 2016-12-13
  • 1970-01-01
  • 2010-09-06
相关资源
最近更新 更多