Какая функция здесь func? Откуда она взялась?

#python #function

#python #функция

Вопрос:

Это мой код:

 def testit(func, *nkwargs, **kwargs):
     try:
        retval = func(*nkwargs, **kwargs)
        result = (True, retval)
     except Exception, diag:
        result = (False, str(diag))
     return result

def test():
     funcs = (int, long, float)
     vals = (1234, 12.34, '1234', '12.34')

     for eachFunc in funcs:
        print '-' * 20
        for eachVal in vals:
            retval = testit(eachFunc, eachVal)
            if retval[0]:
               print '%s(%s) =' % 
                     (eachFunc.__name__, `eachVal`), retval[1]
            else:
               print '%s(%s) = FAILED:' % 
                     (eachFunc.__name__, `eachVal`), retval[1]

if __name__ == '__main__':
    test()
  

Какова функция func в третьей строке. Я думаю, что это переменная. Как это стало именем функции?

Комментарии:

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

Ответ №1:

Функции Python — это объекты первого класса. Это означает, что вы можете присвоить такой объект переменной и передать его другой функции. Сам акт выполнения def functionname(): ... инструкции присваивает такому объекту имя ( functionname здесь):

 >>> def foo(): return 42
...
>>> foo
<function foo at 0x107e9f0d0>
>>> bar = foo
>>> bar
<function foo at 0x107e9f0d0>
>>> bar()
42
  

Итак, выражение

 funcs = (int, long, float)
  

принимает 3 встроенные функции и помещает их в кортеж. funcs[0]('10') вернет целочисленный объект 10 , потому funcs[0] что это еще одна ссылка на int() функцию, поэтому funcs[0]('10') даст вам точно такой же результат, как int('10') .

Эти функциональные объекты передаются testit() функции в цикле с:

  for eachFunc in funcs:
    print '-' * 20
    for eachVal in vals:
        retval = testit(eachFunc, eachVal)
  

So eachFunc привязан к объектам функции, на которые funcs ссылается кортеж, один за другим.

testit() принимает этот объект функции в качестве func параметра, затем вызывает его:

 def testit(func, *nkwargs, **kwargs):
     try:
        retval = func(*nkwargs, **kwargs)
  

итак, это вызывает int() long() float() различные тестовые значения из values кортежа.