我应该在Python中将常量大写吗?

13
在PEP8中,一般规则是使用大写字母声明常量。在现实生活中,可能会存在许多情况:

在PEP8中,一般规定将常量声明为全大写字符。但在实际应用中,情况可能有所不同:

#!env python

DATABASE_HOST = 'localhost'
app = Flask('myapp')
base_two = partial(int, base=2) 

通常我们认为字符串类型或数字类型的变量是不可变的,因此是常量,但对象或函数不是。问题在于代码检查工具无法进行类型检查。

你该如何处理这种情况?我应该将它们大写还是只是禁用检查工具中的这个规则?


1
你可以做任何你想做的事情,但是为了生产和/或团队合作以及可读性,遵循某种风格指南是一个好主意。Pep8就是其中之一。 - reka18
@FHTMitchell,我看到了 - 已删除。但是pep8也描述了通常被认为是“CONSTANT”的内容。值的不可变性与名称无关。 - AChampion
哪个代码检查工具在抱怨未将值大写? - FHTMitchell
@AChampion 当然,你可以说 :) - FHTMitchell
1
我认为这不是一个逻辑上正确的定义。它说明常量在模块级别上被定义,但没有说明什么被视为常量。通常情况下,常量在模块级别上定义,并使用下划线分隔单词并以全大写字母书写。例如:MAX_OVERFLOW和TOTAL。 - boh
@FHTMitchell pylint 抱怨。就像我上面给出的例子一样,无法确定模块级符号是用作常量、未在外部使用的私有对象还是函数。 - boh
1个回答

2

个人而言,我只在向外部提供永远不应更改的值时才使用大写。否则,如果该值仅是逻辑流程的一部分,则可以保持小写,这是可以接受的。

FLAG = object()

def func(arg_with_default = FLAG):
    if arg_with_default is FLAG:
         do_default()
    else:
         do_something_else(arg_with_default)

我认为你混淆了不可变性和常量的概念。
t = (1, 2)
t[0] = 3  # error -- immutable
t = 3.14  # fine -- not constant

Python没有常量的概念。每个变量都可以被覆盖,因此在需要确保变量不被更改的情况下,使用大写字母来表示可能是一个好方法。

如果代码检查工具(linter)抱怨你没有将不需要大写的内容大写,我建议禁用该选项。


谢谢。禁用整个名称检查规则是可以的,但不是最佳选择。我猜没有简单的方法来强制执行这个规则了。 - boh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接