返回布尔值和消息的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 可以做的事情(grepwc 工作),但这与您所询问的内容是分开的。 谢谢你们的 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”方式是啥?

用模拟函数替换真实返回值和函数实现的 Pythonic 方式

在 react-table 中显示布尔值和时间戳值:React Table+ React+Typescript

为啥是布尔值和布尔值

编辑布尔值和运算符

Java布尔返回if语句[重复]