首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >语句装饰器

语句装饰器
EN

Stack Overflow用户
提问于 2015-01-30 22:07:12
回答 4查看 5.8K关注 0票数 7

我们有一些代码看起来如下:

代码语言:javascript
复制
from third_party_library import foo

for n in range(3):
    try:
        foo(args)
        break
    except:
        print "Retry %i / 3" % n

我想使用一个装饰器,让我们的代码更仔细,如下所示:

代码语言:javascript
复制
from third_party_library import foo

@retry(3)
foo(args)

这会产生语法错误。我是遗漏了什么,还是python只是不允许语句中的装饰者呢?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-01-30 22:09:08

装饰器只能应用于函数和类定义,例如:

代码语言:javascript
复制
@decorator
def func():
    ...

@decorator
class MyClass(object):
    ...

你不能在语言的任何地方使用它们。

要做您想做的事情,您可以创建一个普通的retry函数,并将fooargs作为参数传递。实现如下所示:

代码语言:javascript
复制
def retry(times, func, *args, **kwargs):
    for n in xrange(times):
        try:
            func(*args, **kwargs)
            break
        except Exception:  # Try to catch something more specific
            print "Retry %i / %i" % (n, times)
票数 13
EN

Stack Overflow用户

发布于 2015-01-30 22:08:51

Python不允许对语句进行修饰;它们只允许在类和函数定义中使用。您可以在语法规范顶部附近看到这个。

票数 5
EN

Stack Overflow用户

发布于 2015-01-30 22:10:17

装饰器是在Python2.4中引入的。最初,它们只支持函数和方法声明(佩普318)。

Python3将它们扩展到类声明(佩普3129)。

任何其他语言结构都不支持装饰器。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28245450

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档