首页 > 个性签名 正文
【免费空间装扮代码】用于代码分析/调试的5个真正方便的python编码器

时间:2023-03-06 16:29:12 阅读: 评论: 作者:佚名

装饰器的优点是容易应用,为代码提供了很多附加功能。本文介绍了5种方便的装饰器,可轻松应用于调试代码时遇到的实际问题。

在定时功能性能检查中继器运行之前,询问try-catch是否确定要包装功能。这份文件的目的是提供现成的装饰器,启发人们想出方便的通用装饰器。

开始之前:你知道装饰器也能追踪状态吗?例如:您可以通过计算函数调用的次数来限制速度。请务必阅读编写理解: python-decorator工作原理、应用方法和使用时间的decorator的最佳实践。在这篇文章中,我将通过越来越复杂的六个阶段来探索装饰机。

1.计时器

让我们从简单的开始。我们将从打印运行函数所需时间的装饰器开始。这是代码:

From functools import wraps

Import time

Def timer(func):

@wraps(func)

Defwrapper (* args,* * kwargs) :

Start=()

# Call the actual function

Res=func(*args,**kwargs)

Duration=()-start

print(f '[{ wra }]took { duration * 1000 } ms ')

Return RES

Return wrapper我们的装饰器本身用@wraps(func)包裹着。这是为了确保我们传递我们的包装函数。如果我们不做wra,就只会打印“wrapper”,而不是我们实际装饰的函数。

我会在计算小数的函数中使用这个装饰器。

From functools import wraps

Import time

Def timer(func):

@wraps(func)

Defwrapper (* args,* * kwargs) :

Start=()

# Call the actual function

Res=func(*args,**kwargs)

Duration=()-start

print(f '[{ wra }]took { duration * 1000 } ms ')

Return RES

Return wrapper

@timer

Defisprime(编号:int) :

checks whether a number is a prime number ' ' '

Isprime=False

For I in range(2,number):

If((编号% I)==0) :

Isprime=True

布雷克

Return isprime

If _ _ name _ _==' _ _ main _ _ '

Isprime(number=155153)现在调用函数来检查输出。

2。性能检查

计时我们的功能很有用,但我们想要更多的信息。除了持续时间外,以下修改器还提供有关函数的信息,包括名称和文档字符串、内存使用量等性能信息。

From functools import wraps

Import time

def performance _ check(func):

' Measure performance of a function ' ' '

@wraps(func)

Defwrapper (* args,* * kwargs) :

()

Start_time=(

) res = func(*args, **kwargs) duration = () - start_time current, peak = () () print(f"\nFunction: {} ({})" f"\nMemory usage: {current / 10**6:.6f} MB" f"\nPeak memory usage: {peak / 10**6:.6f} MB" f"\nDuration: {duration:.6f} sec" f"\n{'-'*40}" ) return res return wrapper

我们还是用计算素数的函数上使用这个装饰器:

from functools import wraps import time,tracemalloc def performance_check(func): """Measure performance of a function""" @wraps(func) def wrapper(*args, **kwargs): () start_time = () res = func(*args, **kwargs) duration = () - start_time current, peak = () () print(f"\nFunction: {} ({})" f"\nMemory usage: {current / 10**6:.6f} MB" f"\nPeak memory usage: {peak / 10**6:.6f} MB" f"\nDuration: {duration:.6f} sec" f"\n{'-'*40}" ) return res return wrapper @performance_check def isprime(number: int): """ Checks whether a number is a prime number """ isprime = False for i in range(2, number): if ((number % i) == 0): isprime = True break return isprime if __name__ == "__main__": a = isprime(number=155153) print(a)

我们调用素数函数来看看输出:

3.中继器

此装饰器在调用时重复某个功能。这可以方便测试性能或压力测试,例如

def repeater(iterations:int=1): """ Repeats the decorated function [iterations] times """ def outer_wrapper(func): def wrapper(*args, **kwargs): res = None for i in range(iterations): res = func(*args, **kwargs) return res return wrapper return outer_wrapper

我们使用一个打印hello的函数来测试一下,让它执行两次。

def repeater(iterations:int=1): """ Repeats the decorated function [iterations] times """ def outer_wrapper(func): def wrapper(*args, **kwargs): res = None for i in range(iterations): res = func(*args, **kwargs) return res return wrapper return outer_wrapper @repeater(iterations=2) def sayhello(): print("hello")

现在调用 sayhello() 将产生以下输出,这个装饰器可以很好地用于执行几次,例如测试函数的性能

4. 在执行函数之前提示你是否继续执行

这个装饰器可以添加到需要很长时间才能完成或具有重大后果(如删除数据)的函数中。一旦你调用该函数,装饰器就会确保你在调用之前确认你要执行该函数。否则它只会返回而不调用该函数。

def prompt_sure(prompt_text:str): """ Shows prompt asking you whether you want to continue. Exits on anything but y(es) """ def outer_wrapper(func): def wrapper(*args, **kwargs): if (input(prompt_text).lower() != 'y'): return return func(*args, **kwargs) return wrapper return outer_wrapper

我们依然使用sayhello函数来演示该装饰器的功能

def prompt_sure(prompt_text:str): """ Shows prompt asking you whether you want to continue. Exits on anything but y(es) """ def outer_wrapper(func): def wrapper(*args, **kwargs): if (input(prompt_text).lower() != 'y'): return return func(*args, **kwargs) return wrapper return outer_wrapper @prompt_sure('Sure? Press y to continue, press n to stop. ') def sayhello(): print("hi") if __name__ == "__main__": sayhello()

我们能够在装饰器上设置提示消息。当我们调用sayhello()时,会看到

Sure? Press y to continue, press n to stop.

如果输入 'y' 那么我们将执行sayhello(),任何其他输入(包括没有输入将阻止sayhello()执行)。

5. 装饰器中的 TryCatch

这使用装饰器将您的函数包装在 try-except-block 中。优点是,只需一行 Python 代码,您的整个函数就可以免受异常的影响。这是代码的样子:

def trycatch(func): """ Wraps the decorated function in a try-catch. If function fails print out the Exception. """ @wraps(func) def wrapper(*args, **kwargs): try: res = func(*args, **kwargs) return res except Exception as e: print(f"Exception in {}: {e}") return wrapper

我们将在下面的函数中使用这个装饰器

def trycatch(func): """ Wraps the decorated function in a try-catch. If function fails print out the exception. """ @wraps(func) def wrapper(*args, **kwargs): try: res = func(*args, **kwargs) return res except Exception as e: print(f"Exception in {}: {e}") return wrapper @trycatch def trycatchExample(numA:float, numB:float): return numA / numB if __name__ == "__main__": trycatchExample) trycatchExample(9,0)

现在,当我们调用trycatchExample(9, 3)函数时返回3.0。如果我们调用trycatchExample(9, 0)(除以 0),它会正确返回以下内容

Exception in trycatchExample: division by zero

我建议仅将此装饰器用于调试代码,并更准确地捕获函数中的错误。

结论

通过这篇文章,我希望能够提供更多关于装饰器带来的优势的信息。如果我启发了你,请分享你自己的一些方便的装饰器。

如果你有建议/澄清,请发表评论,以便我改进这篇文章。

  • 评论列表

发表评论: