Что делает символ @ в iPython/Python

Код, который я читаю, использует @batch_transform. Что делает символ @? Это специфично для ipython?

from zipline.transforms import batch_transform
from scipy import stats

@batch_transform
def regression_transform(data):
    pep_price = data.price['PEP']
    ko_price = data.price['KO']
    slope, intercept, _, _, _ = stats.linregress(pep_price, ko_price)

    return intercept, slope

person Nyxynyx    schedule 07.11.2013    source источник


Ответы (3)


Синтаксис @ сигнализирует о том, что batch_transform является декоратором Python, подробнее об этом читайте в вики, цитируя:

Декоратор Python — это специальное изменение синтаксиса Python, которое позволяет нам более удобно изменять функции и методы (и, возможно, классы в будущей версии). Это поддерживает более читаемые приложения DecoratorPattern, а также другие варианты использования.

Также ознакомьтесь с документацией:

Определение функции может быть заключено в одно или несколько выражений декоратора. Выражения декоратора оцениваются, когда функция определена, в области, содержащей определение функции. Результат должен быть вызываемым, который вызывается с объектом функции в качестве единственного аргумента. Возвращаемое значение привязывается к имени функции, а не к объекту функции. Несколько декораторов применяются вложенным способом

person Óscar López    schedule 07.11.2013
comment
Эпический ответ на stackoverflow: stackoverflow.com/questions/739654/ - person nickzam; 07.11.2013

Это декоратор. Декоратор Python.

Определению функции, метода или класса может предшествовать специальный символ @, известный как декоратор, цель которого — изменить поведение последующего определения.

Декораторы обозначаются символом @ и должны располагаться на отдельной строке непосредственно перед соответствующей функцией, методом или классом. Вот пример:

class Foo(object):
    @staticmethod
    def bar():
        pass

Кроме того, у вас может быть несколько декораторов:

@span
@foo
def bar():
    pass

Вот хороший урок по этому поводу. Вот отличный поток для SO< /а>.

person Games Brainiac    schedule 07.11.2013

любая функция может быть обернута с помощью символа decorator на @

пример

def decor(fun):
    def wrapper():
        print "Before function call"
        print fun()
        print "Before function call"
    return wrapper

@decor
def my_function():
    return "Inside Function"

my_function()


## output ##
Before function call
Inside Function
Before function call

[ПРИМЕЧАНИЕ] даже classmethod и staticmethod реализованы с помощью декораторов в python

В вашем случае будет функция с именем batch_transform, а у вас она imported!

person Siva Cn    schedule 07.11.2013
comment
Я думаю, вы имеете в виду return wrapper, иначе вы создадите... черную дыру или что-то в этом роде. - person rodrigo; 07.11.2013
comment
@rodrigo, да, ты прав - person Siva Cn; 07.11.2013