return -1
Python 处理错误的方法与 C 不同。如果提供的数据有问题,只需让 AssertionError 通过,或使用自定义错误消息引发 TypeError 或 ValueError。带有断言语句的自定义错误消息是最简单的:
assert port_number > 0, "Invalid port number"
断言语句可以在编译时禁用这一事实可能是您重新考虑是否要在您的情况下使用断言语句的原因。通常的做法是不使用断言语句来验证函数用户的输入,而仅用于内部健全性检查。另一方面,健全性检查和验证之间的界限并不明确。没有断言语句的部分代码示例:
if port_number <= 0:
raise ValueError('Invalid port number')
if not isinstance(port_number, (int, float)):
raise TypeError('Port number must be some kind of number')
我个人使用断言语句来验证数据,如果这些数据无效,迟早会导致崩溃(参见“duck-typing”)。我还在开发过程中大量使用 assert 语句,以像使用静态类型语言一样检查我的数据。如果我强烈怀疑自己代码的稳定性和可靠性,我只会使用这些类型的断言。
下一行:
assert self.handle == None
如果我没记错的话,PEP8 说你应该写assert self.handle is None。至少它得到了比我聪明的人的认可。
assert isinstance(port_number, int) or isinstance(port_number, float)
如果你真的需要这个,可以写成isinstance(port_number, (int, float))。但事实证明你没有。你不应该关心是否有人传递了一个数字原始类型或一些重载所有比较运算符的自制类。
也许您可以做的一件事是尝试将端口转换为整数并查看它是否可用:
try:
port_number = int(port_number)
except ValueError:
raise ValueError("Invalid port number")
在这种情况下,您也可以让ValueError 通过,但是对于新手来说,该消息的信息量较少。