Python - 在函数内部定义常量

Posted

技术标签:

【中文标题】Python - 在函数内部定义常量【英文标题】:Python - define constant inside function 【发布时间】:2020-01-08 02:47:20 【问题描述】:

鉴于 Python 中没有真正的常量,惯例是以大写字母命名它们以传达意图。

在以下示例代码中,FIRSTSECOND 是常量:

def fibonacci_generator(count):
    FIRST, SECOND = 0, 1
    a, b = FIRST, SECOND
    for _ in range(count):
        yield a
        a, b = b, a + b

print(list(fibonacci_generator(10)))

但是对于这两个常量,PyCharm 给出警告:

函数中的变量应为小写

还有其他正确的方法来定义函数中的常量吗? (不抑制 PyCharm 警告)

【问题讨论】:

我经常喜欢在函数中命名一些值,以便以后能够使用它来简化表达式。当我知道我以后不想更改该值时,我发现能够将其标记为常量很有帮助,以便让编译器或 IDE 在我(或其他维护人员)无意中更改初始值时警告我。在 c/c++ 中,我会用 const 标记变量,而在 java 中,我会将它标记为 final。这些不是像引力常数那样的“通用”常数,因为该值可能特定于函数每次运行时。所以使用模块常量是没有帮助的。 【参考方案1】:

根据PEP8,常量应该定义在模块级别

常量通常在模块级别定义并编写 用下划线分隔单词的所有大写字母。例子 包括MAX_OVERFLOWTOTAL

在函数或方法中没有命名常量的约定。

你可以:

接受警告,或者 抑制它,或者 使用“正常”的小写名称

在这种情况下,您也可以使用默认参数而不会收到警告,但这似乎只是为了绕过 PEP8 约定警告:

但是,这会适得其反,因为您违反了一项约定,以免收到有关违反另一项约定的警告。

【讨论】:

我会利用它声明常量将在模块级别定义而不是更深的事实。 @Jab 在我的回答中提到了两次。如果您觉得这还不够,请随意编辑它:) 我明白了,一个“应该”按照 PEP8 在模块级别定义常量。但是,抑制的默认参数方式完全是一团糟,甚至不应该被远程视为一种选择,因为它有可能完全改变方法的行为。如果 PEP8 中没有函数级常量的约定,我认为实际上是一个不足,应该由委员会纠正,因为您建议的其他 3 个选项都在迫使开发人员处理限制,我们为什么要处理?跨度> @DeepSpace 我有一种以正确方式编码的奇怪冲动,所以这种情况让我很恼火:D。我不想在顶部定义常量,因为我相信对象应该尽可能地缩小范围。而且我也不想使用小写字母来表示常数,不,先生。我只剩下警告抑制了,除非万不得已,否则也不想这样做。让我们等待更多的输入。我希望这个问题足够有意义,可以考虑。 @Razzle 考虑使用mypy 更多细节我认为如果你问一个新问题会更好【参考方案2】:

除了@DeepSpace 提出的以外,其他可能的选择是(1)使用带下划线前缀的变量名,例如_FIRST_SECOND等; (2) 改写一个类,使常量成为类级常量。

【讨论】:

以上是关于Python - 在函数内部定义常量的主要内容,如果未能解决你的问题,请参考以下文章

可以使用命令define定义变量吗

Python嵌套函数和闭包

golang基础类型

ChatGPT问答[2]-Python类中的方法是闭包吗?是否拥有闭包的性质?

在 React 类组件内部渲染常量