我想知道我在做什么是一种适当的断言方法。我正在尝试为 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 风格是使用
None
和 is
而不是 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
将是 True
或 False
并且代码将非常易读。connection_prepared = prepare_for_connection(*args,**kwargs)
if connection_prepared:
do_something()
else:
do_something_else()
关于Python断言风格,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17530627/