Python装饰器打印“无”

时间:2018-02-11 06:19:29

标签: python python-3.x python-decorators

import random
import time

def timeit(func):

    def wrapper(*args, **kwargs):
        start = time.time()
        func(*args, **kwargs)
        print ("{} took {} secs \n".format(func.__name__, time.time() - start))
    return wrapper


@timeit
def insort(l):
    """ Uses insetion sort for sorting list """

    for i in range(1, len(l)): 
        temp = l[i]
        j = i
        while j > 0 and l[j - 1] > temp:
            l[j] = l[j - 1]
            j -= 1
            l[j] = temp
    return l


@timeit
def bublesort(l):
    """ Uses insetion sort for sorting list """

    for i in range(len(l)-1, 0, -1):
        for j in range(i):
            if l[j] > l[j+1]:
                l[j], l[j+1] = l[j+1], l[j]
    return l


x =random.sample(range(2000), 1000) 
print (insort(x[:]))
print (bublesort(x[:]))

以上代码输出:

insort took 0.0629999637604 secs 

None
bublesort took 0.104000091553 secs 

None

为什么在每次结果后都不打印,我该如何预防呢? 此外,我是装饰员的新手,所以我想知道是否有更好的方法来计时我的代码。

2 个答案:

答案 0 :(得分:2)

替换原始函数的包装器忽略返回值并返回a = [[1, 2, 3], [11, 12, 13]] b = [1, 2, 3] class Array def meow case self when Array(Array(Int32)) puts self.transpose else puts "OK" end end end a.meow b.meow

进行以下更改:

def timeit(func):

    def wrapper(*args, **kwargs):
        start = time.time()
        ret = func(*args, **kwargs)
        print ("{} took {} secs \n".format(func.__name__, time.time() - start))
        return ret
    return wrapper

这将使您的装饰工作正常。如果要避免打印返回值,请更改

None

print (insort(x[:]))
print (bublesort(x[:]))

一般情况下,如果您不想打印某些内容,请不要将其传递给insort(x[:]) bublesort(x[:])

答案 1 :(得分:2)

  

为什么在每次结果后都不打印,我该如何预防呢?此外,我是装饰员的新手,所以我想知道是否有更好的方法来计时我的代码。

它正在打印包装器(None)的返回值,因为:

print (insort(x[:]))
print (bublesort(x[:]))

您告诉解释器打印这些函数的返回值。 如果您不想看到None,那么您应该调用这些函数:

insort(x[:])
bublesort(x[:])