Объявление функции в Python

Я использую Theano в Python. У меня есть следующий код:

outtmp = trainfunc(some_parameters)

Я не могу найти ни одного объявления функции trainfunc, в то время как я могу найти только фрагмент кода перед предыдущим как:

# Function compilation
trainfunc = TrainFn1Member(some_other_parameters)

Я могу найти объявление TrainFn1Member, но две функции (trainfunc и TrainFn1Member) не имеют одинаковой подписи (входные параметры).

Что это значит, и является ли второй сегмент кода объявлением trainfunc?


person iBM    schedule 01.08.2013    source источник


Ответы (1)


В основном, когда имя начинается с заглавной буквы, это имя класса (если только оно не написано полностью в верхнем регистре, тогда оно в основном означает константу). В Python нет оператора new, поэтому этот шаблон именования очень важен для отличия функций от классов (в любом случае, это общий шаблон). Я не знаю Theano, но я полагаю, что TrainFn1Member — это класс, который реализует метод __call__, поэтому вы можете вызывать его экземпляр как функцию. Найдите __call__ в определении класса TrainFn1Member.


ОБНОВИТЬ:

Согласно вашему комментарию, TrainFn1Member - это функция (что довольно странно, судя по тому, что я сказал выше, и что не является моей идеей ;)). В этом случае он должен вернуть какое-то callable, что означает, что он возвращает одну из трех вещей (надеюсь, я ничего не упустил):

  1. функция (def или lambda)
  2. экземпляр класса, который реализует __call__
  3. метод некоторого объекта (функция, привязанная к некоторому экземпляру класса)

Поскольку я вообще не знаю Theano, я могу только предложить искать глубже, зная о тех, что выше.. (и добро пожаловать в Хогвартс;))

person lupatus    schedule 01.08.2013
comment
Я уверен, что это не класс. Я могу найти объявление как: def TrainFn1Member (параметры): ... - person iBM; 02.08.2013
comment
довольно странно (согласно соглашению об именах), но тогда он должен возвращать функцию или экземпляр некоторого класса, который реализует __call__. Единственное, что я могу предложить в этой ситуации, это копнуть глубже.. ;) определенно TrainFn1Member порождает некоторые callable. - person lupatus; 02.08.2013
comment
TrainFn1Member возвращает другую функцию. Посмотрите исходный код для TrainFn1Member; там, вероятно, есть оператор lambda или def. - person Chris Barker; 02.08.2013
comment
если этот trainfunc = TrainFn1Member(...) взят из здесь, то это "немного" сложно .. но здесь несколько комментариев перед генерацией функции (может быть полезно возможно, но у меня нет больше времени, чтобы узнать, что он на самом деле делает, в любом случае, я надеюсь, что немного помог в правильном направлении, чтобы узнать) - person lupatus; 02.08.2013
comment
theano.function() возвращает объект, реализующий __call__. Вот почему это можно назвать. Это нормально, что TrainFn1Member не принимает тот же параметр, который он возвращает, поскольку TrainFn1Member создает функцию Python с помощью Theano. - person nouiz; 02.08.2013