@符号在iPython / Python中做了啥[重复]

Posted

技术标签:

【中文标题】@符号在iPython / Python中做了啥[重复]【英文标题】:What does the @ symbol do in iPython/Python [duplicate]@符号在iPython / Python中做了什么[重复] 【发布时间】:2013-11-19 14:01:51 【问题描述】:

我正在阅读的代码使用@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

【问题讨论】:

【参考方案1】:

@ 语法表明 batch_transform 是一个 Python 装饰器,请在 wiki 中阅读有关它的更多信息,引用:

Python 装饰器是对 Python 语法的特定更改,它允许我们更方便地更改函数和方法(可能还有未来版本中的类)。这支持 DecoratorPattern 更具可读性的应用程序,但也支持其他用途

也看看documentation:

一个函数定义可以被一个或多个装饰器表达式包装。定义函数时,在包含函数定义的范围内评估装饰器表达式。结果必须是可调用的,它以函数对象作为唯一参数进行调用。返回值绑定到函数名而不是函数对象。多个装饰器以嵌套方式应用

【讨论】:

*** 上的精彩回答:***.com/questions/739654/…【参考方案2】:

它是一个装饰器。 Python 装饰器。

函数、方法或类定义前面可能有一个称为装饰器的@ 特殊符号,其目的是修改后面定义的行为。

装饰器用@ 符号表示,并且必须放在一个单独的行上,紧挨在相应的函数、方法或类之前。这是一个例子:

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

另外,你可以有多个装饰器:

@span
@foo
def bar():
    pass

这是一个good lesson。这是great thread on it for SO。

【讨论】:

【参考方案3】:

任何函数都可以使用decorator by @ 符号包装

例子

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

[注意] 甚至 classmethodstaticmethod 都是使用 python 中的装饰器实现的

在你的情况下,会有一个名为batch_transform的函数,你有imported它!

【讨论】:

我想你的意思是return wrapper,否则你会创造出……一个黑洞什么的。 @rodrigo,是的,你是对的

以上是关于@符号在iPython / Python中做了啥[重复]的主要内容,如果未能解决你的问题,请参考以下文章

^= 在 python 中做了啥[关闭]

〜运算符在Python中做了啥[重复]

哈希在python中做了啥?

built-in method select 在 Python 3 中做了啥?

对象的 __init__() 方法在 python 中做了啥? [复制]

retranslateUi 在 PyQT 中做了啥