Pythonic way to return a boolean value and a message
本问题已经有最佳答案,请猛点这里访问。
我有一个简单的脚本,它检查各种Linux进程,并找到其中一个进程,记录特定的消息("特定"是指引用服务的名称)。
我的问题是:让一个多条件函数返回一个布尔值和一个字符串(在打印的消息中使用)的正确方法是什么?
下面是我当前解决方案的精简版(使用元组):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | import subprocess import time def _isProcessRunning(cmd): return int( subprocess.check_output( '{} | grep -v grep | wc -l'.format(cmd), shell=True ) ) > 0 def processGroupFound(): if _isProcessRunning('ps auwxx | grep duplicity'): return (True, 'Duplicity') elif _isProcessRunning('who | grep pts'): return (True, 'SSH') elif _isProcessRunning('netstat -na | grep ESTA | grep 5901'): return (True, 'VNC') else: return (False, '') def worker(): while True: process_found, service_string = processGroupFound() if process_found: print('{} found; skipping'.format(service_string)) else: print('Continuing on') time.sleep(10) if __name__ =="__main__": worker() |
这是可行的,但我关心的是正确地执行它(特别是在风格上,但是如果您在这个简短的示例中收集到不正确的逻辑,请随时在那里评论。感谢您的帮助!
python中的空字符串是"false",因此返回(false"")有点多余。我可以这样做:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | def processGroupFound(): if _isProcessRunning('ps auwxx | grep duplicity'): return 'Duplicity' elif _isProcessRunning('who | grep pts'): return 'SSH' elif _isProcessRunning('netstat -na | grep ESTA | grep 5901'): return 'VNC' else: return '' def worker(): while True: service_string = processGroupFound() if service_string: print('{} found; skipping'.format(service_string)) else: print('Continuing on') time.sleep(10) |
(见4.1真值测试)
我想这也会是Python(但可能只有我一个人)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | class NoRunningService(RuntimeError): pass def findService(): if _isProcessRunning('ps auwxx | grep duplicity'): return 'Duplicity' elif _isProcessRunning('who | grep pts'): return 'SSH' elif _isProcessRunning('netstat -na | grep ESTA | grep 5901'): return 'VNC' else: raise NoRunningService def worker(): while True: try: service_string = findService() except NoRunningService: print('Continuing on') else: print('{} found; skipping'.format(service_string)) time.sleep(10) |