我需要将Python中函数的输出作为参数传递给另一个函数。唯一的问题是第一个函数返回一个元组,整个元组需要传递给第二个函数。
例如:
我有一个库函数:
def some_function(some_string, some_number):
# does something
return (text,id)
现在我想将从text
返回的id
和some_function
作为参数传递给另一个函数。问题是该函数还有其他参数。我还需要检索由some_string
和number
的不同值生成的许多文本和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")
以便扩展元组并将text
和id
作为参数发送?
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")
答案 0 :(得分:4)
你有两个选择*;要么先显式解包函数结果:
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
作为位置参数(而不是上面的关键字参数)在之后传递来自f
的解压缩结果,即
a('piyush', '23', *f('12', 'abc'), '123')
您将获得SyntaxError: only named arguments may follow *expression
。在*
解包后,您无法获得位置参数,必须将关键字用于任何其他参数。
* 除非您:
答案 1 :(得分:2)
您还可以更改签名中参数的顺序:
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
这样可以保持所有函数的调用与它们相同。只有函数的内部工作改变,而不是签名。