原始问题
我已经创建了一个函数,它等待特定字符串出现在串行端口上,并返回所有字符读取,直到找到该字符串,否则返回false.这很方便,但我想知道它是否被认为是不好的做法?
澄清:
主要目标是等待特定字符串在给定的时间内出现.除了IO错误,可能的结果是True(字符串确实出现)或False次要目标是获取整个输出,因为在寻找的实际答案之前可能存在我想要解析的信息.我想可能是我可以在一个返回值中合并主要和次要目标.
def MyFunc(s, timeout) : test = get_some_input(timeout) if test.endswith(s) return test else return False
编辑:另一个建议的答案是提出异常.我不认为这是一个好主意,因为超时是预期的行为.我的意思是,如果有一个用于指定超时的参数,那么超时是可能的结果,而不是例外.
编辑2:因为我需要存储输入,所以使用类是正确的解决方案.wait for函数具有明确的返回值,但是也可以访问在超时之前读取的整个字符串.
class Parser : def __init__(self, sport_name): self.currentMsg = '' self.ser = serial.Serial(sport_name, 115200) def WaitFor(self, s, timeOut=None): self.ser.timeout = timeOut self.currentMsg = '' while self.currentMsg.endswith(s) != True : # should add a try catch here c=self.ser.read() if c != '' : self.currentMsg += c else : print 'timeout waiting for ' + s return False return True
jelovirt.. 26
是不是更适合返回None
而不是False
?
是不是更适合返回None
而不是False
?
我相信正统的Python设计将返回None.该手册说:
没有
此类型具有单个值.有一个具有此值的对象.可以通过内置名称None访问此对象.它用于表示在许多情况下缺少值,例如,它从未明确返回任何内容的函数返回.它的真值是错误的.
最好返回一个字符串AND一个布尔值(如标题中所示),而不是返回一个字符串或一个布尔值.您不必弄清楚返回值的含义.它应该是完全明确的,正交问题应该分成不同的变量.
(okay,value) = get_some_input(blah); if (okay): print value
我倾向于不再返回元组,因为它感觉很有趣.但这样做完全有效.
返回"无"是一个有效的解决方案,已在此处提及.
方便的是在这种情况下返回一个空字符串.
除了Python中的空字符串,无论如何都将评估为False.所以你可以称之为:
if Myfunc(s, timeout): print "success"
另外:正如S.Lott指出的那样,真正的Pythonic方式是返回None.虽然我选择在字符串相关的函数中返回字符串.确实是一个偏好的问题.
此外,我假设Myfunc的调用者只关心获取一个字符串来操作 - 空或不.如果调用者需要检查超时问题等,最好使用异常或返回None.
如果字符串及时到达,您可以返回该字符串,或者引发指示超时的适当异常.