将函数输出作为参数传递给另一个函数

Pass function outputs as arguments to another function

我需要将 Python 中一个函数的输出作为参数传递给另一个函数。唯一的问题是第一个函数 returns 一个元组,整个元组需要传递给第二个函数。

例如:

我有一个库函数:

def some_function(some_string, some_number):
    # does something
    return (text,id)

现在我想将从 some_function 返回的 textid 作为参数传递给另一个函数。问题是该函数还有其他参数。我还需要检索将由 some_stringnumber.

的不同值生成的许多文本和 ID

根据满足的条件,我想调用另一个看起来像这样的函数

 if abcd:
     other_function(name,phone,**some_function("abcd","123")**,age)
 elif xyz:
     other_function(name,phone,**some_function("xyz","911")**,age)
 else:
     other_function(name,phone,**some_function("aaaa","000")**,age)

那么我应该用什么替换 some_function("abcd","123") 以便它扩展元组并将 textid 作为参数发送?

other_function是这样定义的

def other_function(name, phone, text, id, age):
   ...
    return 

简单地传递 some_function("aaaa","000") 作为参数是否有效?


我问这个是因为我写了一个简单的代码来检验我的假设,它给了我一个空白输出。

def f(id,string):
    return ("123", "hello")

def a(name, age, id, words, phone):
     print name + age + id + words + phone


def main():
    a("piyush", "23", f("12", "abc"), "123")

你有两个选择*;要么首先显式解压缩函数结果:

id, words = f('12', 'abc')
a('piyush', '23', id, words, '123')

或在对a的调用中使用元组解包,并通过关键字提供最后一个参数:

a('piyush', '23', *f('12', 'abc'), phone='123')

如果不熟悉此语法,请参阅 What does ** (double star) and * (star) do for parameters?


请注意,如果您尝试将 phone 作为位置参数(而不是上面的关键字参数)传递 after,则来自 f 的解压缩结果, 即

a('piyush', '23', *f('12', 'abc'), '123')

你会得到SyntaxError: only named arguments may follow *expression* 解包后不能有位置参数,你 必须 使用关键字作为任何附加参数。


* 除非你:

  • 重新排列参数的顺序,如;或
  • 等待 Python 3.5 的发布,因为 .

您还可以更改签名中参数的顺序:

def a(name, age, id, words, phone):
     name = name
     age=age
     id=id
     words=words
     phone=phone
     print name+age+id+words+phone

a("piyush", "23", 123, *f("12","123"))
piyush23123123hello

这样调用函数的时候就可以直接解包返回值了。 但是请注意,这会使可读性非常差并且调试更加困难。

此外,如果您不想使用解包和更改您调用的函数,您可以像这样更改代码:

def a(name, age, id_words, phone):
     name = name
     age=age
     id=id_words[0]
     words=id_words[1]
     phone=phone
     print name+age+id+words+phone

a("piyush", "23", f("12","123"), "123")
piyush23123hello123

这样做的好处是可以让所有的函数调用保持原样。只有函数的内部工作发生变化,而不是签名。

假设你生活在未来,正确的做法是将元组解压到参数列表的中间,如下所示:

a('piyush', '23', *f('12', 'abc'), '123')

不幸的是,你,OP,可能不会活在未来,所以这在很大程度上只对在 September 2015 (or are willing to require a pre-release version of Python before that). This functionality was added as PEP 448, which doesn't go in until Python 3.5 (and, as of 13 April 2015, doesn't even have a patch in trunk yet—but if you really want to live dangerously, you can download the latest patch at #2292 之后找到这个答案的人有帮助,将它应用到 repo 的本地分支,并自己构建它...)。

所以,暂时,你必须伪造它,例如