Python断言风格

扫码查看

我想知道我在做什么是一种适当的断言方法。我正在尝试为 Python 的样式指南制作既简洁又非常正确的东西。

try:
    assert self.port_number == 0
    assert self.handle == None
    assert isinstance(port_number, int) or isinstance(port_number, float)
    assert port_number > 0
except AssertionError:
    return -1

*body of code*

return 0

以上是我的代码摘录,显示了我如何处理参数断言。您可以假设我已经涵盖了所有必要的断言,并且输入是 port_number。这被认为是好的风格吗?有没有更好的办法?

最佳答案

如果调用函数期望成功时输入 0,失败时输入 -1,我会写:

def prepare_for_connection(*args, **kwargs):
    if (self.handle is not None):
        return -1
    if not (isinstance(port_number, int) or isinstance(port_number, float)):
        return -1
    if port_number < 0:
        return -1

    # function body

    return 0

为非异常行为调用抛出和捕获断言错误的机制开销太大。断言更适用于语句应该始终为真的情况,但如果不是由于某些错误,您会在该位置大声生成错误,或者最好在该位置处理它(使用默认值)。如果您愿意,您可以将多个 if 条件组合成一个巨大的条件语句;我个人认为这更具可读性。此外,python 风格是使用 Noneis 而不是 is not==!= 进行比较。

一旦程序离开调试阶段,Python 应该能够优化掉断言。见 http://wiki.python.org/moin/UsingAssertionsEffectively

授予这种从函数返回错误号 (-1/0) 的 C 风格约定并不是特别 Pythonic。我会用 -1 替换 False,用 0 替换 True 并给它一个语义上有意义的名字;例如,将其称为 connection_prepared = prepare_for_connection(*args,**kwargs) ,因此 connection_prepared 将是 TrueFalse 并且代码将非常易读。
connection_prepared = prepare_for_connection(*args,**kwargs)
if connection_prepared:
    do_something()
else:
    do_something_else()

关于Python断言风格,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17530627/

10-12 00:25
查看更多