2015-04-13 5 views
1

Мне нужно передать вывод функции в Python в качестве аргумента другой функции. Единственный улов в том, что 1-я функция возвращает кортеж, и весь кортеж должен быть передан второй функции.Выходы функции выхода в качестве аргументов для другой функции

Для экс:

У меня есть функция библиотеки:

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

Теперь я хочу передать text и id возвращенных из some_function в качестве аргументов другой функции. Уловка состоит в том, что функция имеет и другие аргументы. Мне также необходимо получить много текстов и идентификаторов, которые будут генерироваться разными значениями some_string и number.

В зависимости от состояния встречались, я хочу, чтобы вызвать другую функцию, которая будет выглядеть примерно так

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") 
+1

Это не даст пустой выход, это поднимет TypeError. –

+1

@ DanielRoseman за [ссылка на OP ниже] (http://stackoverflow.com/questions/29602791/pass-function-outputs-as-arguments-to-another-function/29602952#comment47351934_29602983), казалось бы, что они aren На самом деле ничего не работает! Ты прав, через; 'a() принимает ровно 5 аргументов (4 данных)'. – jonrsharpe

ответ

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 

Это имеет advatage держать все функции называют так же, как они мы. Изменены только межличные работы функции, а не подпись.

+0

Я попытался запустить его на [ideone] (http://ideone.com/bImAu2). Я все еще получаю чистый результат. – Piyush

+1

@Piyush вы ** на самом деле не называете 'main' ** ... – jonrsharpe

+0

Ahhh спасибо. Слишком привыкнуть к C++, я думаю. Это сработало. Спасибо – Piyush

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 в качестве позиционного argumen т (а не аргумент ключевое слово, как указано выше) после на распакованные результаты f, т.е.

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

вы получите SyntaxError: only named arguments may follow *expression. Вы не можете иметь позиционные аргументы после * распаковки, вы должны использовать ключевые слова для любых дополнительных аргументов.


* Если только вы либо:

  • изменить порядок параметров, а Oz123 suggests; или
  • Ожидание выпуска Python 3.5, так как noted by abarnert.
+0

Во втором методе вы упомянули, что, если я вызываю функцию a с переменными вместо явного указания значений? Будет ли он работать в таком случае, как (student_name, student_age, * f ('12 ',' abc '), student_age) – Piyush

+0

@Piyush no, я обновил свой ответ с этой информацией; вы не можете иметь позиционные аргументы после '' 'распаковки, вы ** должны ** использовать ключевое слово для этого окончательного аргумента. – jonrsharpe

+1

@Piyush, однако, 'a (student_name, student_age, * f ('12 ',' abc '), age = student_age)' будет работать отлично; он не использует переменные, это проблема, просто у вас не может быть дополнительных позиционных аргументов после '*'. – jonrsharpe

2

Предполагая, что вы живете в будущем, правильный способ сделать это просто распаковать кортеж в середину списка аргументов, например:

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

К сожалению, вы, ОП, вероятно, дон «Я буду жить в будущем, так что это в значительной степени полезно для людей, которые находят этот ответ после September 2015 (или желают предварительно предустановить версию Python до этого). Эта функциональность была добавлена ​​как PEP 448, которая не входит в систему до тех пор, пока Python 3.5 (и, по состоянию на 13 апреля 2015 года, еще не имеет патча в багажнике, но если вы действительно хотите жить опасно, вы можете скачать последнюю версию патч на #2292, примените его к локальной вилке репо и создайте ее самостоятельно ...).

Итак, на данный момент вы должны подделать его, например, как в jonrsharpe's answer.

Смежные вопросы