@符号在Python中做什么?


当前回答

“at”(@)符号在Python中做什么?

@符号是python提供的利用装饰器的语法糖,套用一个问题,这正是关于decorator在Python中做什么的?

简单地说,decorator允许您修改给定函数的定义,而不触及其最内部(它是闭包)。当你从第三方进口精彩的包装时,这是最常见的情况。你可以想象它,你可以使用它,但你不能触摸它的内心和内心。

这里是一个快速示例,假设我在Ipython上定义了read_a_book函数

In [9]: def read_a_book():
   ...:     return "I am reading the book: "
   ...: 
In [10]: read_a_book()
Out[10]: 'I am reading the book: '

你看,我忘了给它加个名字。如何解决这样的问题?当然,我可以将函数重新定义为:

def read_a_book():
    return "I am reading the book: 'Python Cookbook'"

然而,如果不允许我操作原始函数,或者如果有数千个这样的函数需要处理,该怎么办。

通过不同的思维来解决问题,并定义一个新的函数

def add_a_book(func):
    def wrapper():
        return func() + "Python Cookbook"
    return wrapper

然后使用它。

In [14]: read_a_book = add_a_book(read_a_book)
In [15]: read_a_book()
Out[15]: 'I am reading the book: Python Cookbook'

塔达,你看,我修改了read_a_book,但没有触及它的内部封口。没有什么能阻止我配备装修工。

关于什么@

@add_a_book
def read_a_book():
    return "I am reading the book: "
In [17]: read_a_book()
Out[17]: 'I am reading the book: Python Cookbook'

@add_a_book是一种新奇而方便的方式来表示read_a_book=add_a_bok(read_a_bok),这是一种语法糖,没有什么比它更令人着迷的了。

其他回答

@符号还用于访问plydata/pandas数据帧查询pandas.dataframe.query中的变量。例子:

df = pandas.DataFrame({'foo': [1,2,15,17]})
y = 10
df >> query('foo > @y') # plydata
df.query('foo > @y') # pandas

从Python 3.5开始,“@”用作矩阵乘法的专用中缀符号(PEP 0465——请参见https://www.python.org/dev/peps/pep-0465/)

它表示您正在使用装饰器。这是布鲁斯·埃克尔2008年的例子。

行开头的@符号用于类和函数修饰符:

PEP 318:装饰Python装饰器

最常见的Python装饰器有:

@财产@分类法@静态方法

行中间的@可能是矩阵乘法:

@作为二进制运算符。

如果您引用的是python笔记本中使用Numpy库的一些代码,则@operator表示矩阵乘法。例如:

import numpy as np
def forward(xi, W1, b1, W2, b2):
    z1 = W1 @ xi + b1
    a1 = sigma(z1)
    z2 = W2 @ a1 + b2
    return z2, a1