【问题标题】:Is there a good way in Python to create containers for constantsPython中是否有一种为常量创建容器的好方法
【发布时间】:2022-01-08 20:02:15
【问题描述】:

我正在寻找一种 Python 方式来表示常量容器。常量作为属性访问,以便 IDE 可以根据需要自动完成。 目前我使用具有类属性的简单类:

class CONFIG():
    DIR = 'C:'
    VERSION = '2.0'

# usage:
version = CONFIG.VERSION

类作为对象使用,从不实例化,常量是静态类属性。当然,他们可能会被搞砸,这是一个问题。

有没有更好的方法来做到这一点? NamedTuples 不具备动态添加新常量的灵活性和清晰度,除非我错过了什么。

背景: 我的工作流程是 jupyter notebook -> python script -> library module。 例如,在目标,命名空间由读取配置文件的模块或更高级的类提供。 在此之前,我寻找一种简单的方法来在同一个模块或笔记本中命名我的 constants。为清楚起见,我对不同类型的常量使用不同的命名空间,例如CONFIG 用于配置,PARAMS 用于数据模型的参数。

【问题讨论】:

  • 为什么在所有值都是静态的时候还需要一个类CPNFIG。你应该只是DIR = 'C:'
  • 我会说,纯粹出于命名空间的目的使用 Python 类会被某些人认为是一种反模式,包括我在内。如果您需要命名空间,请为常量使用单独的文件,但老实说......我可能会三思而后行。大多数时候,仅仅为常量引入一个单独的命名空间是没有意义的。
  • 我同意@JanLikar 的观点,但也许如果您提供更多信息,我们将能够更好地帮助您,因为现在看来我们过于概括了您的问题。如果您有一堆变量最好将它们设置在一个模块中,但我会三思而后行。
  • 您的 IDE 应该能够自动完成直接的常量定义 VERSION = "2.0",无论它们是在一个类中还是只是放在文件的顶部(它们通常所在的位置)。

标签: python class static


【解决方案1】:

如果您担心代码库中的某个点的值被覆盖,您可以尝试使用类属性。

class Config:
    @classmethod
    @property
    def dir(cls) -> str:
        return "C://"

这不能被意外覆盖,您的 IDE 将帮助您自动完成。但是,它是相当冗长的代码。

【讨论】:

    【解决方案2】:

    [不是真正的答案]

    什么时候应该使用 configs 类。 让我们举个例子。

    class Game:
    
        CRICKET = 1
        FOOTBALL = 2
        BADMINTON = 3
        TENNIS = 4
        VOLLEYBALL = 5
    
        GAME_CHOICES = (
            (CRICKET, 'Cricket'),
            (FOOTBALL, 'Football'),
            (BADMINTON, 'Badminton'),
            (TENNIS, 'Tennis'),
            (VOLLEYBALL, 'Volleyball'),
        )
    
    print(Game.CRICKET) #1
    

    当你有某种选择去做某事时,这种结构会派上用场。例如,您的 DB 模型中可能有一个字段可供您选择。您可以在模型类中添加以下内容

     game_choice = models.IntegerField(
            choices=GAME_CHOICES, default=CRICKET, db_index=True)
    

    【讨论】:

      猜你喜欢
      • 2021-11-02
      • 2018-01-25
      • 2014-04-14
      • 2016-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-09
      • 1970-01-01
      相关资源
      最近更新 更多