Python - 在函数内部定义常量

Sag*_*pta 6 python pep8 pep pycharm

鉴于 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)))
Run Code Online (Sandbox Code Playgroud)

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

函数中的变量应该是小写的

在此处输入图片说明

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

Dee*_*ace 14

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

常量通常在模块级别定义,并全部用大写字母书写,并用下划线分隔单词。示例包括MAX_OVERFLOWTOTAL

函数或方法内部的常量命名没有约定。

你可以:

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

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

在此输入图像描述

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

  • @DeepSpace 我有一种奇怪的冲动,以正确的方式编码,所以这种情况让我很恼火:D。我不想在顶部定义常量,因为我相信对象的范围应该尽可能严格。而且我也不想使用小写字母来表示常量,不,先生。我只剩下警告抑制,除非这是最后的手段,否则我也不想这样做。让我们等待更多的输入。我希望这个问题足够有意义,值得考虑。 (16认同)
  • 我的想法是,“应该”按照 PEP8 在模块级别定义常量。但是,默认的参数抑制方式是一团糟,甚至不应该被视为一种选择,因为它有可能完全改变方法的行为。如果 PEP8 中没有函数级别常量的约定,我认为这实际上是一个缺陷,应该由委员会纠正,因为您建议的其他 3 个选项都迫使开发人员处理限制,为什么我们应该这样做呢? (2认同)

GZ0*_*GZ0 9

除了@DeepSpace 提出的之外,其他潜在的选择是(1)使用下划线前缀的变量名称,例如_FIRST_SECOND等;(2) 编写一个类,并将常量设为类级常量。