python断言有和没有括号

gae*_*fan 91 python assert parentheses

这里有四个简单的assert调用:

>>> assert 1==2
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
AssertionError

>>> assert 1==2, "hi"
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
AssertionError: hi

>>> assert(1==2)
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
AssertionError

>>> assert(1==2, "hi")
Run Code Online (Sandbox Code Playgroud)

请注意,最后一个不会引发错误.调用带或不带括号的断言会导致这种行为有什么区别?我的做法是使用括号,但上面的建议我不应该这样做.

Mar*_*off 113

如果你通过一个完整的解释器,而不是通过IDLE运行它,最后assert会给你一个警告(SyntaxWarning: assertion is always true, perhaps remove parentheses?).因为assert是一个关键字而不是一个函数,所以你实际上是将一个元组作为第一个参数传递而不是第二个参数.

回想一下非空元组的计算结果True,并且因为断言消息是可选的,所以你在assert True编写时基本上都会调用它assert(1==2, "hi").

  • 那么,什么是缩进长断言语的正确方法,与PEP8相比?似乎不可能. (15认同)
  • 原因是`assert(1 == 2)`没有发生``单个表达式周围的括号不会自动创建元组; 如果你执行`assert(1 == 2,)`,你会得到与#4相同的行为.如果你做'print('foo','bar')`而不是'print'foo','bar'`,也会发生同样的事情.你会看到输出的元组 (9认同)
  • http://stackoverflow.com/questions/16065482/how-to-format-a-python-assert-statement-that-c​​omplies-with-pep8 (4认同)

Eri*_*ski 23

如果你把括号放在那里因为你想要一个多行断言,那么另一种方法就是在行的末尾放一个反斜杠,如下所示:

foo = 7
assert foo == 8, \
    "derp should be 8, it is " + str(foo)
Run Code Online (Sandbox Code Playgroud)

打印:

AssertionError: "derp should be 8, it is 7
Run Code Online (Sandbox Code Playgroud)

为什么这个python assert必须与其他所有东西不同:

我认为pythonic意识形态是程序应该自我纠正而不必担心打开断言的特殊标志.关闭断言的诱惑太大了,因此它被弃用了.

我分享你的烦恼,python assert具有相对于所有其他python编程结构的独特语法,并且这种语法再次从python2更改为python3并再次从python 3.4更改为3.6.使断言语句不能从任何版本向后兼容到任何其他版本.

assert是一个三等公民的肩膀,它将在python4中完全删除,当然再次在Python 8.1中.

  • 是否有关于我们应该使用什么而不是断言的文档?Assert 似乎是一个用于验证的逻辑名称,它具有所需的行为,例如在出错时显示特殊消息。 (3认同)

Amb*_*ber 16

assert 1==2, "hi"解析为assert 1==2, "hi""hi"作为关键字的第二个参数.因此,为什么它恰当地给出了错误.

assert(1==2)被解析为与之assert (1==2)相同assert 1==2,因为围绕单个项目的parens不会创建元组,除非有一个尾随逗号,例如(1==2,).

assert(1==2, "hi")解析为assert (1==2, "hi"),因为非空元组(False, "hi")不是false值,并且没有提供给关键字的第二个参数,因此不会产生错误.

你不应该使用括号,因为assert它不是Python中的函数 - 它是一个关键字.


kar*_*tan 11

你可以不用\这样打破assert语句:

foo = 7
assert foo == 8, (
    'derp should be 8, it is ' + str(foo))
Run Code Online (Sandbox Code Playgroud)

或者,如果您有更长的消息:

foo = 7
assert foo == 8, (
    'Lorem Ipsum is simply dummy text of the printing and typesetting '
    'industry. Lorem Ipsum has been the industry\'s standard dummy text '
    'ever since the 1500s'
)
Run Code Online (Sandbox Code Playgroud)

  • 有趣的想法。我讨厌使用反斜杠来继续,这是将断言包装在实用函数中的替代方法(这是我的解决方案)。 (2认同)