自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(3095)
  • 收藏
  • 关注

原创 Python 高手编程系列三千零四:使用进程池

来自 multiprocessing 模块的高级抽象,例如 Pool 类,与在 threading 模块中。multiprocessing 模块最好的一点是它提供了一个即用型的 Pool 类,可以处理管理。但这并不意味着你需要牺牲 multiprocessing 模块中的所有有用的抽象,只要你想。们再看看我们的之前的例子的 main()。的情况,这是一个很大的改进。与“使用线程池”中的描述的线程方式类似,构建一个进程池,这是在依赖多进程以。这可以减少代码中的样板代码数量,并且还可以创建更多可插入的接口。

2025-05-09 13:31:46 260

原创 Python 高手编程系列三千零三:多进程

• 使用 multiprocessing.Queue 类,它是早先用于线程之间通信的 queue.Queue。另一种在进程之间共享状态的方法是在 multiprocessing.sharedctypes 中提供的。• 使用 multiprocessing.sharedctypes 模块,通过它可以在进程之间共享的。不幸的是,os.fork 在 Windows 下不可用,需要生成一个新的解释器以模仿 fork。称,multiprocessing 模块也暴露了类似的线程接口,所以你可能想要使用相同的接口。

2025-05-09 13:31:14 882

原创 Python 高手编程系列三千零二:处理错误与速率限制

在处理这些问题时,你可能会遇到的最后一个问题是外部服务提供商施加的速率限制。以使用 Google Maps API 为例,在撰写本书时,免费和未经身份验证的请求的官方费率限制为每秒 10 个请求和每天 2,500 个请求。当使用多线程时,很容易耗尽这样的限制。更严重的问题是,因为我们没有覆盖任何故障的场景,而处理多线程 Python 代码中的异常比平常更复杂。当客户端超过 Google 的速率时,api.geocode()函数将抛出异常,这是个好消息。

2025-05-09 13:30:43 415

原创 Python 高手编程系列三千零一:使用线程池

是用于与工作线程通信的很好的选择,它来自内置的 queue 模块。何性能改进,但实际上,我们还减少由于缓慢的 print()执行的线程串行化的风险。这里是一个修改版本的 main()函数,它只启动有限数量的工作线程,并使用。建一个严格定义大小的工作线程池,它将处理所有的并行工作,并通过一些线程安全的数。所以通常的想法是启动一些预定义数量的线程,它将从队列中消费工作项,直到完成。我们尝试解决的第一个问题是程序运行中未绑定限制的线程。我们现在能够解决的另一个问题是在线程中输出的潜在的有问题的打印。

2025-05-09 13:30:12 872

原创 Python 高手编程系列三千:何时应该使用多线程

受欢迎的 Python WSGI 兼容的网络服务器:Gunicorn(参考 http://gunicorn.org/)和 uWSGI(参考 https://uwsgi-docs.readthedocs.org),它们使用工作线程处理 HTTP 请求,这些工作线。进程,例如使用 subprocess 模块中的 run()函数,实际上这是在多个进程中进行工作,幸运的是,许多兼容 WSGI 的 Web 服务器允许这样的设置。如果在多线程中毫无顾忌的使用它,中可能会导致串行化,这将撤消多线程的所有好处。

2025-05-09 13:29:39 752

原创 Python 高手编程系列二千九百九十九:为什么需要并发

通过推断程序、算法或问题中的事件,我们可以说,如果它们可以被完全或部分分解为顺序无关的组件(单位),则这些事件是并发的。是完全正确的,但是它们不和 C 或 Java 一样解决同样多的问题。在 Python 中,多核 CPU 的多线程的性能优势有一些限制,我们稍后将讨。冒险(race hazard),这里可能发生意外的结果,因为每个线程运行的代码对数据的状态做。中多线程的局限性,以及使用 Python 线程作为可行解决方案时的一些常见并发问题。并发不是应用程序实现的问题,而只是程序,算法或问题的属性。

2025-05-09 13:29:03 334

原创 Python 高手编程系列二千九百九十八:非确定性缓存

非确定性函数的缓存比记忆化更复杂。事实上,由于这样的函数的每次执行可能给出不同的结果,通常无法使用先前的很长时间的值。你需要做的是判断一个缓存的值的有效时间。在定义的时间段过去之后,所存储的结果被认为是陈旧的,并且高速缓存需要通过新值来刷新。非确定性函数的缓存通常依赖于某些外部状态,这些状态在应用程序代码中很难跟踪。典型的示例组件如下。• 关系型数据库以及常用的任何类型的结构化数据存储引擎。• 通过网络连接(Web API)访问的第三方服务。• 文件系统。

2025-05-09 13:28:32 718

原创 Python 高手编程系列二千九百九十七:使用概率型数据结构

换句话说,对于同一组参数,确定性函数总是返回相同的结果,而非确定性函数可能返回随时间变化的结果。情况下,我们可以从视觉上推断出在不改变 fibonacci()函数的核心的情况下,我们将。缓存的另一个重要的使用案例是保存通过 Web 服务获得的第三方 API 的结果。正如我们所看到的,fibonacci()是一个递归函数,如果输入值大于 2,则调用自身。值的存储和取回的平均复杂度为 O(1),因此这大大降低了被记忆函数的总体复杂性。我们使用 memoize()装饰器的闭包的字典作为缓存值的简单存储。

2025-05-09 13:27:38 308

原创 Python 高手编程系列二千九百九十六:使用任务队列和延迟处理

如果你需要更简单的东西,那么 RQ(参见 http://pythonrq.org/)可能是一个很好的选择。的任务队列框架,支持多个消息服务器,也允许计划执行任务(它可以替代您的 cron 作业)。你不能简单地跳过你正在等待的答复的时间。在这种情况下,增加的响应时间可能不一定是由你的实现导致。间的主要贡献者,并且你没有其他更快的解决方案可以使用,当然,你无法进一步的加快。作时,只需将其添加到处理它的工作队列中,并立即响应接受请求的用户即可。幸运的是,已经有一些流行的工具可以用于构建分布式任务队列。

2025-05-09 13:27:08 299

原创 Python 高手编程系列二千九百九十五:namedtuple

它们的高级版本,称为元启发式(metaheuristics),提供解决数学优化问题的策略,这些问。然而,你可以从具有 O(1)平均复杂度的 get/set 操作的字典中获得相同的好处。优化的,以确保良好的性能与集合大小无关,但所提到的 O(1)复杂度实际上只是平均复杂性。实际上,namedtuple 是基于元组的,这可能也有益于它的性能。在这种情况下,namedtuple 是一个很好的类型,它结合了字典和元组的优点。例如,有已知良好的启发式和近似问题可以在合理的时间内解决非常大的 TSP 问题。

2025-05-09 13:26:29 294

原创 Python 高手编程系列二千九百九十四:使用集合模块

dict.setdefault 方法包括两个步骤(键查找和键设置),它们都具有 O(1)的复杂度,我们已经在第 2 章中的字典部分中了解过。当然,在 Python 中,由于列表类型中内部数组的过度分配,不是每个 list.append()由于有效的 append()和 pop()方法,从序列的两端以相同的速度工作,deque 是一。如果你需要执行大量的弹出、追加和插入,替代列表的 deque 可以提供实质性的性。collections 模块提供了高性能的容器类型,它可以替换内置的容器类型。

2025-05-09 13:25:58 270

原创 Python 高手编程系列二千九百九十三:简化

复杂度是通过使用 in 操作符在 result 列表中的查找引入,该操作的时间复杂度是 O(n)。表不是正确的顺序,那么对它进行排序,这是一个至少有 O(nlogn)复杂度的任务。由于 Python 中的 list 类型的实现细节,在列表中搜索特定的值并不是一个廉价的操。此外,如果你的列表已经是有序的,则可以使用 bisect 将新元素插入到该列表中,中的函数主要设计用于插入或查找给定值的插入索引,并且会保留有序序列的顺序。素的索引查找,这种线性复杂度不是特别糟糕,但如果需要许多这样的操作,它可能具有。

2025-05-09 13:25:20 311

原创 Python 高手编程系列二千九百九十二:大 O 记法

但是通过求解一个简单的 100n2>5n3 不等式,我们可以发现,当 n 小于 20 时,程序 B。但最坏的情况是 O(n),例如,在第 2 章中已经讲过,在字典中查找的平均复杂度为 O(1)。常大的输入时,程序 A 当然是更好的选择,因为它的行为更好的渐近。少个元素,它被认为是常数,而在特定元素个数的列表中进行查找的时间复杂度是 O(n)。例如,看一个这样的操作,将一个元素追加到 Python 的列表类型的实例。为了获取算法的性能与输入数据的大小相关的概述,手动计算它的大 O 记法是最佳的。

2025-05-09 13:24:48 211

原创 Python 高手编程系列二千九百九十一:降低复杂度

一些复杂度指标可以提供代码行为的客观信息,并且sqc 这样的信息有时可以用来推测性能的预期。在 Python 中,测量 McCabe 的复杂度是相对简单的,因为它可以从它的抽象语法树中推。试使用不同的分析策略或工具,或从不同的角度(内存、I/O 操作或网络吞吐量)查看它。执行时间或资源消耗没有实质性的影响,分析并优化这些小组件,需要花费大量的时间,如果你的应用程序似乎没有真正的瓶颈,有可能是你错过了一些东西。码分析,代码分析在查找性能瓶颈的时很有必要。它是一个源代码的指标,因此可以使用适当的工具进行测量。

2025-05-09 13:24:13 320

原创 Python 高手编程系列二千九百九十:分析网络使用情况

正如我前面所说,与第三方程序(如数据库、缓存、Web 服务或 LDAP 服务器)通信的应用程序可能会在这些应用程序运行缓慢时放慢速度。在应用程序端使用常规代码分析方法可以进行跟踪。但是,如果第三方软件自己工作正常,那么罪魁祸首可能是网络。问题可能是配置错误的集线器,低带宽网络链路,或甚至是大量的使计算机多次发送相同的数据包的流量冲突。这里有几个元素,你应该收集一下。要了解发生了什么,首先要研究以下 3 个领域:• 使用以下工具观察网络流量。

2025-05-09 13:23:31 757

原创 Python 高手编程系列二千九百八十九:分析内存使用

• Pympler(http://pythonhosted.org/Pympler/):该库声明支持 Python 2.5,2.6,2.7,3.1,3.2,3.3。objgraph(参考 http://mg.pov.lt/objgraph/)是一个简单的工具,用于创建对象引用的。不幸的是,在使用 Python/C API 的 C 扩展中,引用计数的管理必须使用 Py_INCREF()尽管相当吓人,看似复杂,Python 中的内存管理有着非常好的文档(参考 https://docs.

2025-05-07 08:19:00 670

原创 Python 高手编程系列二千九百八十八:微观分析

这在应用程序上下文之外非常有用,在命令提示符中,例如,在现有应用程序中使用不是很方便。种用法设计的一些较小的 CPython 微优化,它最终会导致二次的运行时间。这种方法当然不是理想的并且 100%准确的,但是它至少比以硬编码的执行时间断言更好,timeit 提供一种简单的方法来测量小代码片段的执行时间,它使用主机系统提供的。优化时,他们将能够在测试中设置其最大执行时间,并确保它不会被进一步的更改所破坏。短代码,但它也会让你很容易犯下危险的错误,这将导致令人困惑的结论。由此,函数所花费的时间可以转换为。

2025-05-07 08:18:30 317

原创 Python 高手编程系列二千九百八十七:扩展硬件

用 pip 下载这个简单的脚本,只要 Graphviz(参见 http://www.graphviz.org/)安装在你的。的输出,而且可以从多个其他分析文件中(如 Linux perf,xperf,gprof,Java HPROF 等)• cProfile:这是一个 C 实现,提供与 profile 工具相同的接口,但具有较少的开销。要以某种方式扩展分析器,那么 profile 可能会是一个更好的选择,因为它不使用 C 扩展。此外,高效的硬件是非常昂贵的(收益递减规律),因此这种方法也存在经济上的限。

2025-05-07 08:17:56 481

原创 Python 高手编程系列二千九百八十六:首先要能工作

只要你坚持使用 Python 化的语法,这些语法在第 2 章和第 3 章中提到过,你的代码应该是。即使 Python 试图使常见的代码模式是最快的,优化工作可能也会混淆你的代码,使代。当你达到了 90%的优化目标,剩下的 10%将使你的代码完全不可读,那么你最好停止。此外,如果有一个很好的库可以满足你的需求,你就没必要重新。设计文档应提供所有交互和每个连接的性质的设计图,从中可以获得系统的整体架构,这是没有意义的,因为真正的。应用程序通常由非常复杂的交互组成,并且,在真正使用它之前,我们不可能全面的。

2025-05-07 08:17:17 277

原创 Python 高手编程系列二千九百八十五:文档驱动开发

说,这个 doctest 也是一个很好的文档,所以,应该发自内心地改变对 doctest 的用法。稍后,doctest 将演变以考虑新的元素或所需的变化。所以,doctests 和常规测试之间的平衡是一个饱受争议的问题,这取决于由团队,可读的和可用的,所以,它们可以是包文档的一部分,而那些不可读的,只是用于构建并。由于我们已经知道如何构建、打包和测试软件,在接下来的两章中,我们将关注如何。本章是关于优化的,并且提供一套一般原则和分析技术。“我们应该忘记小的效能,大约 97%的情况:过早优化是万恶之源。

2025-05-07 08:16:44 468

原创 Python 高手编程系列二千九百八十四:测试环境与依赖兼容性

环境隔离的重要性在本书中已经提到很多次了。通过在应用程序级(虚拟环境)和系统级(系统虚拟化)上隔离执行环境,你可以确保测试可以在可重复的条件下运行。这样,你可以避免受因破坏依赖关系导致的罕见且模糊的问题。正确隔离测试环境的最佳方法是使用支持系统虚拟化的持续集成系统。对于开源项目有很好的免费解决方案,如 Travis CI(Linux 和 OS X)或 AppVeyor(Windows),但是如果你需要这样的东西来测试私有的软件,很可能你需要花一些时间,在一些现有的开源 CI。

2025-05-07 08:15:53 769

原创 Python 高手编程系列二千九百八十三:测试覆盖率

py.test 中的典型解决方案要容易得多。在我们的例子中,我们使用了 py.test 框架中的 monkey-patching 实用程序,但。在上面的代码中,我们使用了一个新的 pytest.yield_fixture()装饰器。Python 中有很多模拟库,但最常见的是 unittest.mock,标准库中也提供了该库。例中,我们手动执行了一切,并提供了一个自定义的 patch_smtplib()固件函数,具有。创建之初,它是一个第三方包,并不是 Python 分发版的一部分,但很快就作为临时包加入。

2025-05-07 08:15:18 880

原创 Python 高手编程系列二千九百八十二:我做测试

OK常规的 TestCase 类和 doctests 也会被执行。最后,nose 提供了类似于 TestCase 方法的断言函数(assertion functions)。这些函数遵循 PEP 8 命名约定,而不是使用 Java 单元测试中的约定(参考 http://nose.readthedocs.org/)。编写测试固件nose 支持 3 个级别的测试固件。● 包级别:可以把 setup 和 teardown 函数添加到__init__.py 模块中,这是一。

2025-05-07 08:14:48 914

原创 Python 高手编程系列二千九百八十一:达式 Python 标准测试工具

name。

2025-05-07 08:14:09 702

原创 Python 高手编程系列二千九百八十:什么样的测试

它们测试代码的绝大部分,并专注于许多应用程序层或者组件相互交互的情况。集成测试的形式和范围因项目的。好的并且流行的方法是至少测试基本指标(静态代码分析和代码风格违例),不允许将任何拉低指标的代码合并到主干。单元测试(unit tests)是完全适合测试驱动开发的底层测试。流行的测试 Web 应用程序的方式,其中负载被理解为来自真实用户或程序化客户端的 Web。这些测试不是通过 TDD 完成的,而是由项目经理、QA 工作人员甚至客户构建的。件真的做了它应该做的,使用与用户相同的媒体并控制输出。

2025-05-07 08:13:30 308

原创 Python 高手编程系列二千九百七十九:文档构建与持续集成

会让你的开发更加轻松。它是一个免费的服务,用于托管使用 Sphinx 的开源 Python 项目的文档。托管使用 Sphinx 构建的文档的最佳方式是生成 HTML 构建,并将其作为你选择的 Web。记住,大多数的 bug 与错误的语法使用无关,而是与逻辑错误和细微的误解有关,它们可。你无法可靠地区别软件中一直存在的 bug 之间的区别,有的是新引入的,有的部分在前一。从消费者的角度看,Sphinx 真的提高了文档的可读性和用户体验。这体现为一些功能和特性在以前版本的软件中正常工作,而在项目开发中的某。

2025-05-07 08:12:34 817

原创 Python 高手编程系列二千九百七十八:构建自己的文档集

请记住:mod:以及前面的元素是由 Sphinx 在 reSTructuredText 中引入的具体指令。这将会在索引页中添加两个新条目,即 Database Access 和 Session。最后,Sphinx 提供了一个行内标记来设置交叉引用。这里,:mod:是模块标记的前缀,是要链接到的模块的名称(如先前注册。

2025-05-07 08:11:06 817

原创 Python 高手编程系列二千九百七十七:链接

用 Python 做事情(参考 http://code.activestate.com/recipes/langs/python/)。docs.djangoproject.com/en/1.9/intro/tutorial01/)解释如何使用 Django 构建应用程序。模块的 docstring 的目的是可以在模块的顶部写入文本。一个技巧(recipe)文档解答一个非常具体的问题,并提供一个解决方案来解决问题。这是框架应用程序中的文档的。● 教程:这是一个逐步的文档,说明如何使用软件的功能。

2025-05-07 08:10:02 515

原创 Python 高手编程系列二千九百七十六:章节结构

reST 提供了易读的自动枚举特性的列表语法(运行结果参见图 9-2),主要有:无序列。如果不想保留单个冒号,可以在前面的文本和::之间插入一个空格。请注意,冒号字符可以放在文本行中。在这种情况下,它将被渲染为单个冒号。表,枚举列表和自定义列表。将被解释并且完全删除。

2025-05-07 08:05:00 294

原创 Python 高手编程系列二千九百七十五:使用现实中的代码示例

Foo 和 bar 是坏成员。当读者试图通过一个使用示例来理解一段代码如何运行时,不切实际的示例会让代码难以理解。为什么不使用现实中的例子?通常的做法是确保每个代码示例都可以剪切并粘贴到一个真正的程序中。

2025-05-07 08:03:56 595

原创 Python 高手编程系列二千九百七十四:7 项技术写作规则

这并不总是很明显,因为一个技术文本解释了一个软件如何工作,并且通常为每个可能获取和使用代码的人而写。● 如果你不是一个真正优秀的作家,不要在文本中讲笑话。在技术文本中滑稽是很难的,很少有作家掌握它。Atomisator 是一个产品,它提取 RSS 源并将其保存在数据库中,并带有筛选功能。每个开发人员都能够输出这样的材料,本节提供了 7 个规则,可以应用在所有情况下。开发者开始写一个持续的流,当他或她犯语法错误,或任何东西,只。一个好的做法是当他们出现时将它们写在第二张纸或屏幕上,这样它们就不会丢。

2025-05-01 22:01:49 393

原创 Python 高手编程系列二千九百七十三:选择正确的工具和常见的陷阱

问题的解决方案是保持你的构建过程的定义尽可能接近源。这是一个很好的方法,静态分析检查可以作为 CI 构建的一部分进行,样的解决方案为你的构建添加了更多的复杂性,而不是减少。它很容易开始,并将给你几乎即时的满足与最小量的工作。如前所述,没有完美的 CI 工具可以适合每个项目,最重要的是,它使用的每个组织和工作。在一些可用的 CI 系统中,比在其他系统中更可能犯某些错误。例如,当你的 CI 中的自动验收测试的速度成为问题时,那么你可以。需要很多时间,通常意味着,它应该分成几个独立的组件,可以单独开发和测试。

2025-05-01 22:01:18 240

原创 Python 高手编程系列二千九百七十二:持续交付

和编译器遵循良好的设计实践,并且它们通过适当的退出代码指示故障,并在 sdout 或 stderr 输出流上返回可读的错误/警告消息。通常没有选择,所有的构建必须在 Ubuntu 或 Mac OS X(仍然在编写本书时的实验)的一些版本中进行。的方法,其中所有验收测试是自动化的,不需要客户的手动批准。项目之一,与 Hudson 配对(这两个项目的开发是分开的,Jenkins 是 Hudson 的一个派生)。一环境中执行所有的构建步骤,所以它的工作方式更像 Jenkins 或 Buildbot 的从服务器。

2025-05-01 22:00:35 725

原创 Python 高手编程系列二千九百七十一:持续的开发过程

使用这样的工具的好处是,开发者可。有很多过程,可以大大简化你的开发,并减少应用程序从准备到发布或部署到生产环境中的时间。如果你的代码需要在不同的环境中测试,矩阵测试(matrix testing)是一个非常有用的。但是对于简单的 GitHub 工作流来说,这是一个真正的问题,对于诸如 C 或 C ++之类的语言,这是显而易见的,因。过更快的并行构建和更昂贵的 CI 计划,比你跳过选择更改的测试,你可以节省更多的费用。杂,其中许多特性分支是同时开发的,因为存在不能由任何 CI 系统自动解决的高冲突风险。

2025-05-01 21:59:52 361

原创 Python 高手编程系列二千九百六十九:集中式系统

原理很简单,每个人都可以得到他/她的系统上的文件的副本,然后对它们进行更改。从那里,每个用户可以向服务器提交(commit)他/她的更改。可以从主干修订版本上进行派生,分开进行更改,然后把更改再合回主干修订版本。这样的一个中央仓库,通常称为上游(upstream),也可以作为追踪所有团队成员的各个仓。例如,复杂的更改涉及大量文件,也非常耗时,并且在整个工。构的版本控制系统有明显的问题,所以,大多数开源社区已经切换到架构更可靠的分布式。最后,用户负责备份自己的仓库,而在集中式基础设施中则不是这样,通常是。

2025-05-01 21:58:49 213

原创 Python 高手编程系列二千九百六十八:CFFI

CFFI 是 Python 的外部函数接口,是 ctypes 的一个替代品。它不是标准库的一部分,但是它作为一个 cffi 包,可以很容易地从 PyPI 上获得。它不同于 ctypes,因为它更加强调重用纯 C 代码,而不是在单个模块中提供大量的 Python API。它的方式更复杂,并且还有一个特性,它允许你使用 C 编译器将集成层的某些部分自动编译为扩展。因此,它可以用作填补 C 扩展和 ctypes 之间差距的混合解决方案。因为它是一个非常大的项目,不可能用很少的段落就能快速地介绍它。

2025-05-01 21:58:09 542

原创 Python 高手编程系列二千九百六十七 :函数和方法

函数和方法的名称应该使用小写加下划线。但在旧的标准库模块中并不总是这样。Python 3 对标准库做了大量重组,所以大多数函数和方法都有一致的大小写。不过对于某些模块(例如 threading)而言,你可以访问使用混合大小写(mixedCase)的旧的函数名称(例如 currentThread)。留着它们是为了更容易向后兼容,但如果你不需要在旧版Python 中运行代码,那么应该避免使用这些旧的名称。

2025-05-01 21:56:50 449

原创 Python 高手编程系列二千九百六十六 :命名和使用

常量用来定义程序所依赖的一组值,例如默认配置文件名。好的做法是将所有常量集中放在包中的一个文件内。举个例子,Django 采用的就是这种方法。一个名为 settings.py 的模块提供所有常量,如下所示:SQL_USER = ‘tarek’SQL_PASSWORD = ‘secret’SQL_URI = ‘postgres://%s:%s@localhost/db’ % (SQL_USER, SQL_PASSWORD)MAX_THREADS = 4另一种方法是使用可以被 ConfigPar

2025-05-01 21:56:15 533

原创 Python 高手编程系列二千九百六十五 :Hy

如果你想接受来自其他程序员的任何协作,即使你对最佳代码风格指南有不同的看法,那么也应该坚持遵守 PEP 8。Hy(http://docs.hylang.org/)是完全用 Python 编写的 Lisp 方言。有.hy扩展名的模块都被看作Hy模块,都可以像普通Python模块那样导入。要记住,比遵守 PEP 8 更重要的是项目内的一致性。做的争吵,可能会变成一场永无止境并且永远没有赢家的口水战(flame war)。而且,如果整个项目的代码库处于成熟的开发状态,那么对其重新调整风格(restyling)

2025-05-01 21:52:13 274

原创 Python 高手编程系列二千九百六十四:抽象语法树

Python 语法首先被转换成抽象语法树(Abstract Syntax Tree,AST),然后才被编译成字节码。这是对源代码抽象语法结构的一种树状表示。利用内置的 ast 模块,可以得到对Python 语法的处理过程。利用带有 ast.PyCF_ONLY_AST 标记的 compile()函数或者利用 ast.parse()帮助函数,可以创建 Python 代码的原始 AST。逆向直接转换却没有那么简单,没有用于完成这项功能的内置函数。不过有些项目(例如 PyPy)可以完成这项任务。

2025-05-01 21:51:39 789

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除