ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python同步/异步开发中如何进行调试与分析?python的gamla同步异步调试库的使用教程

2023-01-11 21:39:40  阅读:386  来源: 互联网

标签:python同步/异步开发 python异步开发调试


python同步/异步开发是我们进行开发的很重要的一个环节,如何加快在同步/异步开发尤其是异步开发中进行调试与分析呢?今天我们介绍一个gamla库,来帮助您查找代码中的错误和性能问题。快来一起看看吧~
简要了解 gamla 库提供的 4 个函数,它们有助于查找代码中的错误和性能问题。

gamla是 Python 的函数式编程库。

今天我们将研究它提供的 4 个功能,这些功能可帮助您查找代码中的错误和性能问题。

我们将关注debug、debug_exception和。timeitprofileit

前两个建立在本地breakpoint命令之上。

Python 有一个名为 pdb 的内置命令行调试器。可以通过breakpoint()在任何地方键入来调用它。

运行代码时,会在该位置暂停执行,并出现 pdb 命令提示符。

因为这是语言本身的一部分,我们可以用它来构建更高级的调试工具!

my_list = [1, 2, 'c', 4]
sorted_list = sorted(my_list, key=lambda x: x**2)

运行它会引发异常:

类型错误:** 或 pow() 不支持的操作数类型:“str”和“int”

所以通常你会在某处放置一个断点并对其进行调试,但通常你需要分解出 lambda 并将其放入一个函数中,将值赋给一个变量以便检查它。这会像这样:

def key_fn(x):
  breakpoint()
  return x**2

my_list = [1, 2, 'c', 4]
sorted_list = sorted(my_list, key=key_fn)

但这有点乏味。我们想要的是某种内联断点的方法。这就是debug进来的地方。

它的实现可以被认为是这样的:

def debug(x):
  breakpoint()
  return x

这允许我们像这样内联断点:

from gamla import debug

my_list = [1, 2, 'c', 4]
sorted_list = sorted(my_list, key=lambda x: debug(x)**2)

这意味着当我们只想看一些东西时不需要重构我们的代码。

如果您在管道中编程,这将特别有用:

from gamla import debug, pipe

pipe(
  x,
  f1,
  f2,
  debug,  # Will pause, enabling access into the value after `f2`, and before `f3`.
  f3,
)

调试后
有时我们已经有一个函数在做这项工作,我们只是想看看它返回什么。在这种情况下,使用 更方便debug_after,因为您可以将它写在函数之外,而不必费心将括号正确地放在值周围。

from gamla import debug_after

@debug_after
def key_fn(x):
  return x**2

my_list = [1, 2, 'c', 4]
sorted_list = sorted(my_list, key=key_fn)

自然,还有一个debug_before。

调试异常
这很好,但是如果我们有一个巨大的列表怎么办?我们将不得不循环使用很多值,直到我们找到显示问题的值。

debug_exception救援。它类似于debug_before,但只有在底层函数引发异常时才会中断。然后就可以查看导致此异常的值。

它可以用作装饰器或内联,包装一个函数。

from gamla import debug_exception

@debug_exception  # Will break only once!
def key_fn(x):
  return x**2

my_list = [1, 2, 'c', 4]
sorted_list = sorted(my_list, key=key_fn)

In [1]: @debug_exception # 只会中断一次!
   ...: def key_fn(x): 
   ...: 返回 x**2 
   ...:
在 [2] 中:my_list = [1, 2, 'c', 4]
在 [3] 中:sorted_list = sorted(my_list, key=key_fn) 
> debug_utils.py(90)debug_exception() 
-> raise e 
(Pdb) x 
('c',) 
(Pdb) c 
...
请注意,输入值由 引用x,并显示为tuple,因为可能有多个参数。

如果您的函数是异步的,则上述所有函数的工作方式都相同。你不必担心。

计时
这个函数获取一个函数并记录它花费了多少时间。它还添加了一些颜色来指示它有多慢。



它也适用于async:



简介
这个实用程序在后台使用yappi来打印同步或异步函数上最慢的内部调用。



profileittimeit每个都有稍微不同的用途——前者非常详细并且执行速度慢,因此可用于在本地调试难以发现的问题,而后者速度极快并提供良好的输出,这意味着它可以安全使用在生产中。

将调试工具视为代码意味着您可以根据需要为自己构建一组工具,例如debug_compose,它会在管道中的每个步骤后暂停,或者将其与其他有用的概念一起使用,例如when(greater_than(3), debug),它会让您查看值但仅如果他们通过了一些条件。

希望这对您有用,如果您发现有用的模式,请务必向我们发送 PR。

标签:python同步/异步开发,python异步开发调试
来源:

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有