return -1
Python处理错误的方法与C不同。如果提供的数据存在问题,只需让AssertionError
通过,或引发一个带有自定义错误消息的TypeError
或ValueError
。使用assert语句和自定义错误消息是最简单的方法:
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')
个人而言,我使用断言语句来验证数据,如果无效的话,迟早会导致崩溃(参见“鸭子类型”)。在开发过程中,我也会大量使用断言语句来检查我的数据,就像在静态类型语言中一样。只有在我非常怀疑自己的代码的稳定性和可靠性时,才会使用这些类型的断言。
下一行:
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
通过,但对于新手来说,信息可能不够清晰。