返回布尔值和消息的Pythonic方式[重复]
Posted
技术标签:
【中文标题】返回布尔值和消息的Pythonic方式[重复]【英文标题】:Pythonic way to return a boolean value and a message [duplicate] 【发布时间】:2017-04-25 10:43:47 【问题描述】:我有一个简单的脚本,它可以检查各种 Linux 进程,并在找到其中一个时记录特定的消息(在引用服务名称方面是“特定的”)。
我的问题:让一个多条件函数返回一个布尔值和一个字符串(用于打印消息)的正确的 Pythonic 方式是什么?
这是我当前解决方案的精简版(使用元组):
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()
这可行,但我关心是否正确执行(特别是在风格上,但如果您在此简短示例中收集到不正确的逻辑,也请随时在此处发表评论。感谢您的帮助!
【问题讨论】:
这很好。完全地道。我可能会省略括号 (return True, 'Duplicity'
),但在某些情况下我可能不会。
这里还有很多其他选项***.com/questions/354883/…
我不会打扰return
语句周围的括号,但除此之外,似乎还可以。我一直怀疑shell=True
,并使用外部实用程序来完成Python 可以做的事情(grep
和wc
工作),但这与您所询问的内容是分开的。
谢谢你们的 cmets(尤其是你们的,@ShadowRanger – 我将使用 shell 进程进行最低限度的工作,然后使用 Python 完成大部分工作)。
【参考方案1】:
Python 中的空字符串是“falsey”,因此返回 (False, '') 有点多余。我可能会这样做:
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 Truth Value Testing)
【讨论】:
测试返回值是C-ish而不是pythonic,这就是为什么我更喜欢异常解决方案。 感谢您的回答!我忘记了空字符串的“虚假性”。 当我开始写我的答案时,@Gribouillis 给出的答案并不存在。我同意他的说法更像蟒蛇——它至少在“请求宽恕,而不是许可”下得到分数。【参考方案2】:我认为这也是pythonic(但可能只是我)
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)
【讨论】:
非常感谢。在心理上,我将“例外”视为“需要纠正的致命错误”的想法。我会努力的。 ;) 远不止这些。当一个函数没有处理一个案例时,引发一个异常!以上是关于返回布尔值和消息的Pythonic方式[重复]的主要内容,如果未能解决你的问题,请参考以下文章
用模拟函数替换真实返回值和函数实现的 Pythonic 方式