如何编写符合PEP8规范的Python断言语句格式?

69

如何格式化一个符合PEP8标准的长断言语句?请忽略我例子的牵强性。

def afunc(some_param_name):
    assert isinstance(some_param_name, SomeClassName), 'some_param_name must be an instance of SomeClassName, silly goose!'

无法使用括号将其括起来,因为这会改变assert语句的行为,因为它是一个关键字而不是内置函数。


assert 应该只用于 调试 目的,任何其他用途都是对 assert 功能的滥用。当使用 -O 选项运行 Python 时,所有 assert 也会被删除。 - Wessie
19
@Wessie 我不认为那跟此事有关。 - Gareth Latty
4
除了@Wessie之外,assert有许多用途。它可以向代码的人类读者说明特性、意图、限制和期望。它在健康、风格良好、生产代码中占据一席之地。 - Bob Stein
5个回答

95
重要的是要记住,PEP8只是一个指南,甚至强调有时应该打破规则

但最重要的是:要知道何时不一致 - 有时样式指南并不适用。

考虑到这一点,我可能会使用旧的行连续写法来编写此代码。
def afunc(some_param_name):
    assert isinstance(some_param_name, SomeClassName), \ 
           'some_param_name must be an instance of SomeClassName, silly goose!'

如果您(或您的代码检查工具)对此不满意,可以执行以下操作:
def afunc(some_param_name):
    assert isinstance(some_param_name, SomeClassName), ( 
           'some_param_name must be an instance of SomeClassName, silly goose!')

甚至可能是:

def afunc(some_param_name):
    assert isinstance(some_param_name, SomeClassName), ( 
           'some_param_name must be an instance of SomeClassName, '
           'silly goose!')

1
我认为这是更易读的解决方案。括号延续比反斜杠行延续更受欢迎,但这是一个普遍的说法,个别情况可能会有所不同。 - Gareth Latty
+1 for "规则应该被打破"。我倾向于使用旧的行继续方式,因为它是需要最少按键次数的解决方案。这也是我更喜欢Python而不是PHP的原因之一:deffunction更短。当然,还有比这更具说服力的原因。;-) - Aya
太棒了,谢谢。完全同意PEP8只是一个指南而已。我们使用flake8(结合了pyflakes和pep8.py),我觉得肯定有某些东西能满足PEP8精神和代码检查器的要求。 - stantonk
这是错误的(assert的第二行应该只缩进4个空格),但它演示了如何做到,谢谢。 - Wyrmwood

7
ERR_MESSAGE_01 = '''
Some really long error message
'''

assert condition(a,b), ERR_MESSAGE_01

这是我的做法...我认为它完全符合要求。

7
当这篇文章谈论PEP-8合规性时,CAPS_WITH_UNDERSCORES的命名方式并没有起到帮助作用。 - Gareth Latty
是的,说得有道理...这可能是从C #define和常量中继承下来的。虽然有点可疑...但我还是坚持这个观点。此外,我认为它是一个模块级常量,PEP8告诉我们要这样命名。 - Joran Beasley
6
常量: 常量通常在模块级别上定义,并且使用下划线分隔单词,全大写字母书写。例如MAX_OVERFLOW和TOTAL。 - Joran Beasley
是的,除非在这种情况下,将错误消息提取到模块级常量中会很麻烦(意味着用户必须跳来跳去才能看到值),而CONDITION()是一个函数,不是一个常量。 - Gareth Latty
其实我通常会创建一个名为errors.py的模块,其中包含了所有错误消息作为(命名得当的)常量...显然不会将它们命名为ERR_1之类的...另外,我也修复了函数名和局部变量a、b的命名,你在这方面是100%正确的 :) (这也非常适合本地化)。 - Joran Beasley

5
值得注意的是,可以用括号包裹内容,但不是你想象的那种方式。
assert isinstance(some_param_name, 
                  SomeClassName), ('some_param_name must be an instance of '
                                   'SomeClassName, silly goose!')

我不会说这种写法非常易读,但在某些情况下,它可能是正确的选择。


3
这在最大行长度部分的Pep8中有描述。

反斜杠有时仍然是适当的。例如,[...] 另一个这样的情况是使用assert语句。

因此,Pep8的建议是像mgilson的第一个例子那样做,例如:
def afunc(some_param_name):
    assert isinstance(some_param_name, SomeClassName), \ 
           'some_param_name must be an instance of SomeClassName, silly goose!'

1
def afunc(some_param_name):
    assert (isinstance(some_param_name, SomeClassName)
            ), 'some_param_name must be an instance of SomeClassName, silly goose!'

这将为您提供括号中隐含的行续行,符合PEP 8建议,而不会破坏assert行为。
或者:
def afunc(some_param_name):
    assert isinstance(some_param_name, SomeClassName), (
           'some_param_name must be an instance of SomeClassName, silly goose!')

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