特定代码行的类似于装饰器的语法

时间:2018-06-28 07:52:46

标签: python decorator python-decorators

我知道装饰函数通常用于Python函数。

单行代码是否有类似的概念/语法?

示例:使用

def measuretime(lineofcode):
    start = time.time()
    lineofcode()
    print time.time() - start

然后

@measuretime
im = Image.open(BytesIO(base64.b64decode(data)))

将被解释为

start = time.time()
im = Image.open(BytesIO(base64.b64decode(data)))
print time.time() - start

注意:

  • 我知道像这样测量执行时间不是最佳选择,最好使用timeit等,但这只是一个随机示例,它显示了我正在寻找的内容(单行代码的修饰符) )

  • 我正在寻找1或2行代码的解决方案(当然是+函数的定义)。如果该解决方案需要两行以上的代码(即,比@measuretime之类的代码要多),那么最好放弃并照常做:

    start = time.time()
    im = Image.open(BytesIO(base64.b64decode(data)))
    print time.time() - start
    

4 个答案:

答案 0 :(得分:4)

如果您想在一行代码之前和之后做一些事情,那么context manager将是合适的:

class HowToMap
    {
        private IEnumerable<Product> products;
        private IEnumerable<Color> colors;

        void Demo()
        {
            colors = products.SelectMany(r => r.Colors.Select(rr => new { r, rr.ColorEnum }))
                .GroupBy(x => x.ColorEnum)
                .Select(g => new Color { ColorEnum = g.Key, Products = g.Select(x => x.r).ToList() });
        }
    }

答案 1 :(得分:2)

不。装饰器基本上是一个函数,它将另一个函数用作参数并返回“装饰”函数。 @decorator只是一种语法糖。

答案 2 :(得分:1)

否,但是最接近您目标的是使用上下文管理器来覆盖一行代码。

import time

class timer(object):
    def __enter__(self):
        self.start = time.clock()
        return self

    def __exit__(self, *args):
        self.end = time.clock()
        self.interval = self.end - self.start
        print(self.interval)

with timer():
    [i for i in range(100000)]

这将在我的计算机上输出以下内容:

0.005583688506699192

答案 3 :(得分:0)

尽管您可以尝试查看jupyter(以前称为ipython),但该语言中没有这样的东西。它具有%%timeit快捷方式。