@符号在Python中做什么?
当前回答
用不同的方式来表达别人的想法:是的,这是一个装饰师。
在Python中,它类似于:
创建函数(在@call下面)调用另一个函数对创建的函数进行操作。这将返回一个新函数。您调用的函数是@的参数。用返回的新函数替换定义的函数。
这可以用于各种有用的事情,因为函数是对象,只是必要的指令。
其他回答
行开头的@符号用于类和函数修饰符:
PEP 318:装饰Python装饰器
最常见的Python装饰器有:
@财产@分类法@静态方法
行中间的@可能是矩阵乘法:
@作为二进制运算符。
它表示您正在使用装饰器。这是布鲁斯·埃克尔2008年的例子。
此代码段:
def decorator(func):
return func
@decorator
def some_func():
pass
相当于此代码:
def decorator(func):
return func
def some_func():
pass
some_func = decorator(some_func)
在装饰器的定义中,您可以添加一些通常不会由函数返回的修改后的内容。
“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
推荐文章
- Visual Studio Code:如何调试Python脚本的参数
- 使用元组/列表等等。从输入vs直接引用类型如list/tuple/etc
- 结合conda环境。Yml和PIP requirements.txt
- 将命名元组转换为字典
- 如何使x轴和y轴的刻度相等呢?
- Numpy在这里函数多个条件
- 在Python中,使用argparse只允许正整数
- 如何排序mongodb与pymongo
- 不可变与可变类型
- 列表是线程安全的吗?
- 操作系统。makdirs在我的路径上不理解“~”
- 如何在Django模板中获得我的网站的域名?
- 在django Forms中定义css类
- 如何在Python中scp ?
- Numpy Max vs amax vs maximum