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

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

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

Post by perasperaadastra »

Извините, ночью уже не хватило сил ставить эксперимент в консоли :)

Я никак не могу взять в толк, чем это принципиально отличается от

Code: Select all

def f2(kwargs):
    print "f2 kwargs =",kwargs
def f1(kwargs):
    print "f1 kwargs =", kwargs
    f2(kwargs)

a = 1
b = 2
f1({'a':a, 'b':b})
Тот же словарь, те же возможности? Или в вызове f1(a=1,b=2) есть что-то более кошерное?
User avatar
f_evgeny
Уже с Приветом
Posts: 10367
Joined: 12 Apr 2001 09:01
Location: Lithuania/UK

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

Post by f_evgeny »

perasperaadastra wrote:Извините, ночью уже не хватило сил ставить эксперимент в консоли :)

Я никак не могу взять в толк, чем это принципиально отличается от

Code: Select all

def f2(kwargs):
    print "f2 kwargs =",kwargs
def f1(kwargs):
    print "f1 kwargs =", kwargs
    f2(kwargs)

a = 1
b = 2
f1({'a':a, 'b':b})
Тот же словарь, те же возможности? Или в вызове f1(a=1,b=2) есть что-то более кошерное?
Ну, навскидку тем:
- вообще можно ничего не передавать

Code: Select all

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

In [2]: f1()
f1 kwargs = {}

In [3]: def f2(kwargs):
    print "f2 kwargs =", kwargs
   ...:     

In [4]: f2()
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-4-fdec4c1c071f> in <module>()
----> 1 f2()

TypeError: f2() takes exactly 1 argument (0 given)
- в конце будет функция, которая принимает не словарь, а именованные аргументы

Code: Select all

def f1(a=None, b=None):
    print "f1  a =", a
    print "f1 b =", b


In [11]: kwargs = {'a': 1, 'b': 2}

In [12]: f1(**kwargs)
f1  a = 1
f1 b = 2

In [13]: 
Причем это может быть вообще не Ваша функция в конце и даже Вы можете не знать, какие там параметры.
Дальше, все будет только хуже. Оптимист.
User avatar
perasperaadastra
Уже с Приветом
Posts: 20128
Joined: 21 Feb 2009 22:55
Location: Лох Онтарио

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

Post by perasperaadastra »

Ааа! Теперь понятно! Большое спасибо за объяснение! :fr:
User avatar
f_evgeny
Уже с Приветом
Posts: 10367
Joined: 12 Apr 2001 09:01
Location: Lithuania/UK

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

Post by f_evgeny »

perasperaadastra wrote:Ааа! Теперь понятно! Большое спасибо за объяснение! :fr:
Any time.
Дальше, все будет только хуже. Оптимист.
User avatar
perasperaadastra
Уже с Приветом
Posts: 20128
Joined: 21 Feb 2009 22:55
Location: Лох Онтарио

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

Post by perasperaadastra »

Жаль, я не знал про именованные аргументы раньше! А то как раз недавно столкнулся с проблемой, когда случайно поменял порядок аргументов при вызове функции, а в определении остался старый порядок. Найти проблему было, конечно, не сложно, но можно было бы ее совсем избежать, если бы использовал именованные аргументы.

Я немножко адаптировал пример под свою ситуацию с "лишними" аргументами:

Code: Select all

def f2(x=0, b=0, **remainder):
    print "f2 formal args:  ", x, ", ", b
    print "f2 arg remainder:", remainder

def f1(d, **remainder):
    print "f1 formal arg:   ", d
    print "f1 arg remainder:", remainder
    x = d*2
    f2(x, **remainder)

f1(9, a=1, b=3, c=7)
Очень удобно!

Но, в принципе, мне было не обязательно передавать "лишние" аргументы из одной функции в другую. Все вложенные функции имеют read-only access к переменным из более внешних. Это, как я понимаю и есть те самые "клошары", о которых шла речь выше.

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