【问题标题】:How to format a python assert statement that complies with PEP8?如何格式化符合 PEP8 的 python 断言语句?
【发布时间】:2013-04-10 12:52:46
【问题描述】:

如何格式化符合 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 时,所有asserts 也会被删除。
  • @Wessie 我不明白这有什么关系。
  • 除了@Wessie,assert has many uses。它可以告知人类读者代码的功能、意图、限制和期望。它在健康、有风格的生产代码中占有一席之地。

标签: python assert pep8


【解决方案1】:

请务必记住,PEP8 只是一个指南,even states that there are times when the rules should be broken

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

考虑到这一点,我可能会用旧式续行来写这个:

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

如果您(或您的 linter)不满意,您可以随时这样做:

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。我认为这是这里更具可读性的解决方案。括号继续首选而不是反斜线继续,但这是一般性陈述,个别情况会有所不同。
  • +1 表示“规则应该被打破”。我倾向于使用旧式续行,如果只是因为它是需要最少击键来编写的解决方案。这也是我更喜欢 Python 而不是 PHP 的原因之一:deffunction 短。当然,还有比这更令人信服的理由。 ;-)
  • 太棒了,谢谢。完全同意 PEP8 作为指导方针。我们使用 flake8(它结合了 pyflakes 和 pep8.py),我认为有 something 可以满足 PEP8 的精神以及 linter。
  • 这是错误的(断言的第二行只能缩进4个空格),但它演示了如何做到这一点,谢谢。
【解决方案2】:
ERR_MESSAGE_01 = '''
Some really long error message
'''

assert condition(a,b), ERR_MESSAGE_01

我是怎么做的……我认为这很好……

【讨论】:

  • 当帖子谈论 PEP-8 合规性时,CAPS_WITH_UNDERSCORES 的名称没有帮助。
  • 是的,公平点...从 c #defines 和常量结转。可疑...但我坚持下去。除此之外,我认为它是一个模块级常量,pep8 告诉我们这样命名
  • 常量:常量通常在模块级别定义,并以全大写字母书写,并用下划线分隔单词。示例包括 MAX_OVERFLOW 和 TOTAL。
  • 是的,除非在这种情况下,将错误消息提取到模块级常量会很尴尬(意味着用户必须四处跳转才能看到值),而CONDITION() 是一个函数,不是常数。
  • 不是真的我通常会创建一个errors.py模块,其中包含我所有的错误消息作为(命名良好的)常量......显然没有将它们命名为ERR_1......我还修复了函数名称和本地a,b 变量名称,因为您在这方面 100% 正确 :)(这也很适合本地化)
【解决方案3】:

值得注意的是,可以用括号括起来,只是不是你想的那样。

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

不过,我不认为它特别具有可读性。在某些情况下,它可能是正确的选择。

【讨论】:

    【解决方案4】:

    这在 Maximum Line Length 部分末尾的 pep8 中进行了描述。

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

    因此,pep8 的建议是按照 mgilsons 的第一个示例,例如:

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

    【讨论】:

      【解决方案5】:
      def afunc(some_param_name):
          assert (isinstance(some_param_name, SomeClassName)
                  ), 'some_param_name must be an instance of SomeClassName, silly goose!'
      

      这为您提供了 PEP 8 推荐的括号中隐含的行延续,而不会破坏断言行为。

      或者:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-05-31
        • 2020-11-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-12
        相关资源
        最近更新 更多