Аргумент при вызове функций по цепочке

User avatar
perasperaadastra
Уже с Приветом
Posts: 20128
Joined: 21 Feb 2009 22:55
Location: Лох Онтарио

Аргумент при вызове функций по цепочке

Post by perasperaadastra »

У меня сложилась такая ситуация:
вызывается функция 1, из нее — ф2, а из ф2 - ф3. Ф3 использует аргумент, который определяется в головном коде. Таким образом, переменная передается из головы в ф1, в ф2 и, наконец, ф3, но не используется в ф1 и ф2, кроме как для передачи дальше по цепочке.

Как правильно в таких случаях действовать? Игнорировать? Или объявить переменную глобальной?
User avatar
Relict17
Уже с Приветом
Posts: 573
Joined: 15 Jan 2016 02:50

Re: Аргумент при вызове функций по цепочке

Post by Relict17 »

Уж точно не глобальную переменную! :)

В чем вообще проблема? ну передаете по цепочке и передавайте на здоровье. Все кошерно, локально и тред-сейфово.
Oleg-NY
Уже с Приветом
Posts: 2418
Joined: 16 Jul 2004 00:32
Location: NY, NY

Re: Аргумент при вызове функций по цепочке

Post by Oleg-NY »

Если только это не методы, а иначе, почему и не "глобальную переменную"?
Oleg-NY
Уже с Приветом
Posts: 2418
Joined: 16 Jul 2004 00:32
Location: NY, NY

Re: Аргумент при вызове функций по цепочке

Post by Oleg-NY »

Oleg-NY wrote:Если только это не методы, а иначе, почему и не "глобальную переменную"?
P.S.: И вообще, вдруг это про линух? Тогда про тред-сейфовость можно поговорить отдельно... еще полно любителей форков и глобальных, да еще и статических переменных. И ведь таки ж сэйф! ;)
Last edited by Oleg-NY on 11 Oct 2016 22:10, edited 1 time in total.
User avatar
perasperaadastra
Уже с Приветом
Posts: 20128
Joined: 21 Feb 2009 22:55
Location: Лох Онтарио

Re: Аргумент при вызове функций по цепочке

Post by perasperaadastra »

Неудобно в том, что куча "ненужных" аргументов, которые иногда забываю написать, а потом чешу репу, пытаясь понять, почему такая-то функция отработала по exception, когда все должно было быть нормально. :)
User avatar
Мальчик-Одуванчик
Уже с Приветом
Posts: 15526
Joined: 27 Sep 2007 22:53

Re: Аргумент при вызове функций по цепочке

Post by Мальчик-Одуванчик »

Обьявите функцию 4 как замыкание в области видимости функции 1
User avatar
perasperaadastra
Уже с Приветом
Posts: 20128
Joined: 21 Feb 2009 22:55
Location: Лох Онтарио

Re: Аргумент при вызове функций по цепочке

Post by perasperaadastra »

А как это по английски (чтобы погуглить, как это сделать в питоне)?
User avatar
M. Ridcully
Уже с Приветом
Posts: 12017
Joined: 08 Sep 2006 20:07
Location: Силиконка

Re: Аргумент при вызове функций по цепочке

Post by M. Ridcully »

Мальчик-Одуванчик wrote:Обьявите функцию 4 как замыкание в области видимости функции 1
Пришёл и всё опошлил. :D

Кстати, ТС вроде в соседнем топике говорил, что на Питоне пишет, так вот там с замыканиями мудохаться надо, насколько я помню.
Мир Украине. Свободу России.
helg
Уже с Приветом
Posts: 4827
Joined: 15 May 2001 09:01

Re: Аргумент при вызове функций по цепочке

Post by helg »

perasperaadastra wrote:А как это по английски (чтобы погуглить, как это сделать в питоне)?
Это, пардон майн френч, клошар.
Oleg-NY
Уже с Приветом
Posts: 2418
Joined: 16 Jul 2004 00:32
Location: NY, NY

Re: Аргумент при вызове функций по цепочке

Post by Oleg-NY »

perasperaadastra wrote:А как это по английски (чтобы погуглить, как это сделать в питоне)?
Дык вроде Гугл и с русским не плохо дружит. Вот оно, преклонение перед Западом в действии! )))
User avatar
perasperaadastra
Уже с Приветом
Posts: 20128
Joined: 21 Feb 2009 22:55
Location: Лох Онтарио

Re: Аргумент при вызове функций по цепочке

Post by perasperaadastra »

helg wrote:
perasperaadastra wrote:А как это по английски (чтобы погуглить, как это сделать в питоне)?
Это, пардон майн френч, клошар.
Клозюры. :D Пойду читать про их.
Oleg-NY wrote:
perasperaadastra wrote:А как это по английски (чтобы погуглить, как это сделать в питоне)?
Дык вроде Гугл и с русским не плохо дружит. Вот оно, преклонение перед Западом в действии! )))
:D И правда, можно найти на русском, но терминология тогда становится довольно непонятной, потому что все, что я знаю про питон, учил на английском языке.
Deckel
Ник закрыт за хамство.
Posts: 357
Joined: 16 Feb 2014 18:34

Re: Аргумент при вызове функций по цепочке

Post by Deckel »

Эта тема и мне интересна. Отпишитесь тут, как найдёте для питона?
User avatar
f_evgeny
Уже с Приветом
Posts: 10367
Joined: 12 Apr 2001 09:01
Location: Lithuania/UK

Re: Аргумент при вызове функций по цепочке

Post by f_evgeny »

perasperaadastra wrote:У меня сложилась такая ситуация:
вызывается функция 1, из нее — ф2, а из ф2 - ф3. Ф3 использует аргумент, который определяется в головном коде. Таким образом, переменная передается из головы в ф1, в ф2 и, наконец, ф3, но не используется в ф1 и ф2, кроме как для передачи дальше по цепочке.

Как правильно в таких случаях действовать? Игнорировать? Или объявить переменную глобальной?
Лично я таких ситуаций стараюсь избегать, но если это Питон, можно передавать так:

Code: Select all

def f(**kwargs):
    print "f kwargs =",kwargs   

def f1(**kwargs):
    print "f1 kwargs =", kwargs
    f(**kwargs)

> f1(a=1, b=2)
f1 kwargs = {'a': 1, 'b': 2}
f kwargs = {'a': 1, 'b': 2}
Где запись **kwargs означает примерно следующее: Любое число именованных аргументов.
Вместо kwargs можно использовать другое имя, но это используется традиционно.
Дальше, все будет только хуже. Оптимист.
User avatar
perasperaadastra
Уже с Приветом
Posts: 20128
Joined: 21 Feb 2009 22:55
Location: Лох Онтарио

Re: Аргумент при вызове функций по цепочке

Post by perasperaadastra »

В f1 вы написали вызов f(**kwargs). А просто f(kwargs) не будет работать? Я думал, что f1 получит параметры и положит их в словарь kwargs, а звездочки нужны только в определении функции... Наверно я что-то не так понял...

Кстати, доступ к переменной a в f будет через kwargs['a'] или функция автоматически распакует словарь и добавит перменную а?
User avatar
f_evgeny
Уже с Приветом
Posts: 10367
Joined: 12 Apr 2001 09:01
Location: Lithuania/UK

Re: Аргумент при вызове функций по цепочке

Post by f_evgeny »

perasperaadastra wrote:В f1 вы написали вызов f(**kwargs). А просто f(kwargs) не будет работать? Я думал, что f1 получит параметры и положит их в словарь kwargs, а звездочки нужны только в определении функции... Наверно я что-то не так понял...

Кстати, доступ к переменной a в f будет через kwargs['a'] или функция автоматически распакует словарь и добавит перменную а?

Code: Select all

def f1(**kwargs):
      2     print "f1 kwargs =", kwargs
----> 3     f(kwargs)
      4 

TypeError: f() takes exactly 0 arguments (1 given)
Если Вы передаете просто kwargs, это значит Вы передаете один позиционный аргумент типа словарь. А функция f(**kwargs) вообще не имеет таких параметров. А звездочки распаковывают словарь в список именованных аргументов произвольной длины.
доступ к этим аргументам как к словарю.
Кстати, большую часть ответов можно было получить посмотрев на приведенные примеры. Это я не из головы написал, это вывод интерактивного режима питона. Этим нужно научиться польоваться обязательно. В него переходят так: запускают консоль и запускают команду питон без параметров. Консолью питона можно пользоваться как:
- Калькулятором
- Для проверки особенностей работы Питона
- Для чтения хелпа по Питону
Дальше, все будет только хуже. Оптимист.

Return to “Вопросы и новости IT”