有效处理可变数量的返回参数的 Pythonic 方法

标签 python coding-style return-value calling-convention

所以我有一个函数可以安静地或冗长地工作。在安静模式下,它会产生一个输出。在详细模式下,它还将中间计算保存到列表中,尽管这样做本身需要额外的计算。

在你问之前,是的,这是一个确定的优化瓶颈,很少需要详细的输出,所以这很好。

所以问题是,有效处理可能会或可能不会返回第二个值的函数的最 pythonic 方法是什么?我怀疑 pythonic 方式将被命名为元组或字典输出,例如

def f(x,verbose=False):
    result = 0
    verbosity = []
    for _ in x:
        foo = # something quick to calculate
        result += foo
        if verbose:
            verbosity += # something slow to calculate based on foo
    return {"result":result, "verbosity":verbosity}

但这需要在不需要时构造字典。

一些替代方案是:

# "verbose" changes syntax of return value, yuck!
return result if verbose else (result,verbosity)

或使用可变参数

def f(x,verbosity=None):
    if verbosity:
        assert verbosity==[[]]
    result = 0
    for _ in x:
        foo = # something quick to calculate
        result += foo
        if verbosity:
            # hard coded value, yuck
            verbosity[0] += # something slow to calculate based on foo
    return result

# for verbose results call as
verbosity = [[]]
f(x,verbosity)

有什么更好的主意吗?

最佳答案

不要返回verbosity。使它成为一个可选的函数参数,由调用者传入,如果不为空则在函数中发生变化。

一些答案​​的非pythonic部分是需要测试返回值的结构。为可选处理传递可变参数避免了这种丑陋。

关于有效处理可变数量的返回参数的 Pythonic 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31679613/

相关文章:

python - 检查我是否可以使用 Python 将文件写入目录

Ruby 方法在执行条件后返回 nil 值

java - 当两者的输出相同时,为什么我的 if/else 语句不匹配?

python - python 列表推导式总是一种好的编程习惯吗?

multithreading - 在后台做一些工作并返回结果

Python - 'NoneType' 对象不可下标(Steam 商品价格小程序)

python - 通过 Python 更改 Konsole 标题

python - 为什么我的基本 PyGame 模块这么慢?

variables - 有没有一种更简洁的方法可以稍后在代码中设置顶级变量而不使其成为 lateinit var?

sdk - "This is an ' on-wire' 格式结构到底意味着什么?”