四年完成400万行Python代码检查,甚至顺手写了个编译器

YOLOv5算法改进(22)— 更换主干网络MobileNetv3 + 添加CA注意力机制 本节课就让我们结合论文来对YOLOv5进行组合改进(更换主干网络MobileNetv3 + 添加CA注意力机制),小白必学~!🌈 阅读详情
作为 Python 的大用户之一,Dropbox 公司内部聚集了数百万行 Python 代码,动态类型的存在让代码越来越难以理解。因此,公司开始利用 mypy 逐步将代码转换为静态类型。虽然效果得到了充分验证,但整个过程充满了各种错误和失败。本文,Dropbox 公司完整输出了从项目研究到实践的 Python 静态检查全过程,以期对各位开发者有所帮助。

事实上,Python 已经成为 Dropbox 公司使用范围最广的语言,其广泛适用于后端服务与桌面客户端应用程序等(当然,Dropbox 公司也在大量使用 Go、TypeScript 以及 Rust 等语言)。

在 Dropbox 公司数以百万计的 Python 代码行中,动态类型的存在让代码越来越难以理解,并严重影响生产力水平。为了缓解这一问题,Dropbox 公司一直在利用 mypy 逐步将代码转换为静态类型(顺带一提,mypy 可能是目前 Python 当中最流行的独立类型检查器,属于开源项目,其核心开发团队来自于 Dropbox。)。

截至目前,Dropbox 已经在成千上万个项目当中使用 mypy,而且效果都得到了很好地验证。但对于此次全方位检查 Python 代码,Dropbox 仍然抱着忐忑的心情,整个过程也充满了错误与失败。在今天的文章中,Dropbox 将向大家分享 Python 静态检查之旅——从最早的学术研究项目,到现在逐步让类型检查与类型提示成为 Python 社区中众多开发人员的常规操作。现在,已经有多种工具支持类型检查功能,包括各类 IDE 与代码分析器等。

1 为什么要进行类型检查?

如果开发者只使用过动态类型的 Python,当然有可能对静态类型以及 mypy 感到陌生。甚至,不少开发者就是因为动态类型而喜欢上 Python,但这事儿在逻辑上就有点莫名其妙。其关键应该在于,静态类型检查是实现规模化的前提:项目越大,需要的静态类型就越多。

一旦项目中包含成千上万行代码,而且有多位工程师在同时使用,以往开发经验告诉我们,理解代码内容就成了保障开发人员工作效率的关键所在。如果没有类型注释,基本的代码作用推理(例如找到函数的有效参数,或者可能的返回值类型)就会成为一大难题。以下是几个在缺少类型注释时,开发人员难以回答的典型问题:

  • 这个函数能返回 None 吗?

  • 这里的 items 参数是干什么用的?

  • id 属性是什么类型:到底是 int、str、抑或是自定义类型?

  • 这个参数需要的是一份清单、一个元组还是一个组?

只要有了类型注释,开发者能够很轻松地回答这些与代码片段相关的问题,例如:

class Resource:	
    id: bytes	
    ...	
    def read_metadata(self, 	
                      items: Sequence[str]) -> Dict[str, MetadataItem]:	
        ...
  • read_metadata 并不会返回 None,因为返回类型不是 Optional[…]

  • items 参数代表一系列字符串,其不可能随意迭代。

  • id 属性为字节字符串。

在理想情况下,我们当然希望把这一切都记录在文档中,但拥有从业经验的开发者肯定知道没这么好的事儿。即使存在此类文档,我们也无法完全信任其中的内容——例如内容含糊不清或者不够准确,因此带来巨大的误解空间。对于大型团队或代码库,这类问题可能产生巨大的影响:

虽然 Python 在项目早期与中期阶段表现良好,但当项目发展到特定阶段后,成功的项目与使用 Python 语言的企业可能面临一个关键性决定:我们是否需要利用静态类型语言重写所有内容?

类似 mypy 这样的类型检查器主要负责提供用于类型描述的形式语言,并通过验证所获得的类型与实现(以及可能存在的可选项)间的匹配解决这一难题。更具体地讲,类型检查器专门提供经过验证的文档。

当然,除此之外,类型检查器还可带来其它助益:

  • 类型检查器能够发现许多微妙(以及不那么微妙)的 bug。其中的典型例子,就是开发者忘记处理的 None 值或者其它一些特殊条件。

  • 重构更简单,因为类型检查器通常能够准确告诉我们需要变更的代码。我们不需要进行 100% 全覆盖测试,这本身也不具备可行性。另外,我们也不需要跟踪深层堆栈以了解到底出了什么问题。

  • 即使是在大型项目中 ,mypy 也能够在几分之一秒内完成完整的类型检查。运行测试通常需要几十秒或者几分钟。类型检查带来的快速反馈,能够帮助开发者更快实现迭代。这意味着不需要编写脆弱且难以维护的单元测试,用以模拟及修复现有代码以获取快速反馈。

  • 以 PyCharm 以及 Visual Studio Code 为代表的 IDE 和编辑器可利用类型注释实现代码补全、高亮显示错误并支持更好的定义功能——这里仅列出几项典型的功能性应用。对于一部分程序员而言,这些功能直接决定着他们的生产效率。这类用例不需要独立的类型检查工具。当然,像 mypy 这样的独立工具仍有助于保证注释与代码之间的同步。

2 启动迁移:性能成为瓶颈

在 Dropbox,我们成立了一个三人小队,从 2015 年底开始研究 mypy。成员分别是 Guido、Greg Price 以及 David Fisher。从那时起,工作开始快速推进。首先,在 mypy 采用面前的最大障碍就是性能。我们一直在将其运行在 CPython 解释器上,这对于 mypy 这样的工具来说速度有点不够用。(作为包含 JIT 编译器的 Python 替代性方案,PyPy 在这方面也帮不上什么忙。)

幸运的是,我们实现了一系列算法层面的改进。我们采用的第一项加速措施就是增量检查。其背后的思路非常简单:如果模块的所有依赖关系都与 mypy 运行前的状态毫无区别,那我们完全可以使用前一次运行的缓存数据获取依赖关系,意味着只需要类型检查修改了的文件及其依赖关系。mypy 则在此基础上更进一步:如果模块的外部接口没有改变,mypy 甚至不需要重新检查导入该模块的其它模块。

在对现有代码进行批量注释时,增量检查确实非常有用,因为其中往往涉及 mypy 的大量迭代运行,用以处理陆续插入且逐渐细化的类型。最初的 mypy 运行仍然相当缓慢,这是因为它需要处理大量依赖项。为此,我们实现了远程缓存。如果 mypy 检测到本地缓存可能已经过期,mypy 将从集中存储库下载整个代码库的最新缓存快照。在此之后,它会以下载到的缓存为基础执行增量构建。这又进一步提高了性能表现。

到 2016 年底,Dropbox 公司已经有大约 42 万行 Python 完成了类型注释。很多用户都热衷于类型检查,而 mypy 的使用则在 Dropbox 各团队之间迅速传播。

情况看起来相当不错,但距离真正的成功还有很长的路。我们开始定期进行内部用户调查,借以找出痛点,并确定需要优先考虑的工作(这种习惯直到今天也一直被保持下来)。其中,有两项请求始终排名最高:更大的类型检查覆盖范围以及更快的 mypy 运行速度。很明显,我们的性能与采用提升工作还没有全部完成。为此,我们还得在这两项任务上再多下点力气。

性能提升方法一:使用 mypy 守护进程

增量构建虽然提升了 mypy 的速度,但仍然没有达到顶峰。大量增量运行可能需要一分钟的处理时长。对于任何面对大型 Python 代码库的用户来讲,其中的原因相信并不难理解:循环导入。

我们拥有数百个模块,模块相互间接导入。如果导入周期的任何文件发生变更,那么 mypy 就必须处理周期中的所有文件,同时还得处理在此周期内导入该模块的所有其它模块。其中最臭名昭著的循环就是“纠结(tangle)”,它给 Dropbox 带来了很大麻烦。其中一度包含有数百个模块,众多测试级乃至产品级功能都要或直接或间接地将其导入。

我们一直在考虑打理这种纠结无比的依赖关系,但却始终没有合适的方法着手进行。毕竟我们不熟悉的代码太多了。因此,我们想出了另一个办法——即使存在这种“纠结”,我们同样可以提升 mypy 速度。答案就是,使用 mypy 守护进程。守护进程是一项服务器进程,负责执行两项非常重要的工作。

首先,它将关于整体代码库的信息保存在内存中,这样每次 mypy 运行就不再需要加载数千条与所导入依赖项相对应的缓存数据。其次,它会跟踪函数与其构造之间的细粒度依赖关系。例如,如果函数 foo 调用函数 bar,那么就存在一项从 bar 到 foo 的依赖关系。当文件发生变更时,守护程序会首先单独处理已经变更的文件;接下来,它会查找该文件中包含的外部可见变更,例如变更的函数签名。守护程序所采用的细粒度依赖项管理机制,能够确保只重新检查实际变更的那些函数——换言之,只检查极少数函数。

实现上述目标当然是个巨大的挑战,因为我们最初的 mypy 实现方案只适合一次处理一个文件。但在实际需求发生变化之后——例如当某个类获得一个新的基类时,我们必须重新处理大量边缘情况。经过艰苦卓绝的努力与投入,我们成功将大部分增量运行缩短至几秒钟。这是一场伟大的胜利,至少在我们当事人看来相当伟大!

性能提升方法二:将 Python 编译为 C

配合之前提到的远程缓存,mypy 守护进程几乎完全解决了增量类用例,工程师们只需要对少量文件进行迭代变更即可。但是,最差情况下的性能表现仍然远未达到最佳状态。进行一次彻底的 mypy build 可能需要 15 分钟,这样的结果当然无法令人满意。由于工程师们在不断编写新代码,并在现有代码当中添加类型注释,因此情况每周都在恶化。我们的用户渴望获得更高的性能,而我们也自然不能让大家失望。

因此,我们决定延续 mypy 立项之初的重要想法——将 Python 编译为 C。遗憾的是,Cython(一款现成的 Python 到 C 编译器)并不能提供任何显著的加速效果,因此我们决定从零开始编写编译器。由于 mypy 代码库(使用 Python 编写)已经全面完成类型注释,因此利用这些注释来加快速度自然是符合逻辑的选择。我构建了一套快速概念验证原型,其在各类微基准测试中将性能提升了 10 倍以上。我们的想法是将 Python 模块编译为 CPython C 扩展模块,并将类型注释转换为运行时类型检查(在运行时中通常被忽略的类型注释,仅供类型检查器使用)。我们开始着手将 mypy 实现由 Python 迁移至真正的静态类型语言,这恰好与 Python 的迁移思路完全匹配。(这种跨语言迁移正成为新的常态,mypy 最初由 Alore 编写,但后来则转换为 Java/Python 自定义语法的混合体。)

对 CPython 扩展 API 的定位,是保持项目整体可管理性的关键所在。我们不需要实现虚拟机或者 mypy 所需要的任何库。此外,我们仍然可以利用一切原有 Python 生态系统与工具(例如 pytest),并能够在开发期间继续使用经过解释的 Python 代码,从而实现极快的编辑测试周期且不必等待编译过程。

这款被我们命名为 mypyc 的编译器(因为它利用 mypy 作为前端来执行类型分析)非常成功。总体而言,我们在不使用缓存的前提下实现了大约 4 倍的运行性能提升。mypyc 项目的核心开发在小团队的推动之下用了大约 4 个月即告完成,团队成员包括 Michael Sullivan、Ivan Levkivskyi、Hugh Han 和我自己。很明显,这里的工作量远少于使用 C++ 或者 Go 完全重写 mypy,相关影响也要小得多。我们希望 mypyc 最终能够被交付至 Dropbox 的其他工程师手上,供他们编译并加速自己的更多代码。

在达成如此出色的性能提升效果的过程中,我们尝试了不少有趣的性能工程方法。编译器可以利用快速、低级 C 构造实现众多操作的加速。例如,对某个已编译函数的调用会被翻译成 C 函数调用,而后者要比调用解释函数快得多。另外,某些操作(例如字典查找)仍然会回退至常规的 CPython C API 调用,从而略微提升编译时的调用速度。总而言之,我们摆脱了解释带来的性能开销,从而稍稍改善了操作的速度表现。

我们还进行了一系列分析工作,希望了解“慢速操作”中的普遍共性。有了这些数据,我们尝试调整 mypyc 为这些操作生成速度更快的 C 代码,或者利用更快的操作方式重写相关 Python 代码(有时候确实没什么好办法,只能硬着头皮重写)。后者通常要比在编译器中自动转换容易得多,不过从长远来看,我们更倾向于实现自动化转换。但还是要具体问题具体分析,有时候为了以最低的投入获得更大的性能提升,我们也会抄近路。

3 实操:检查 400 万行代码

在完成上述工作后,还面临一个重要挑战(也是 mypy 用户调查中排名第二的重要要求)就是提升类型检查的覆盖范围。我们尝试了多种方法以实现这项目标:从有机增长,到专注于 mypy 团队的手动调整,再到静态与动态自动化类型推理等。最后,我们发现其中并不存在简单的实现策略,但我们将多种方法结合起来,从而显著提高了能够在代码库中实现的快速注释工作量。

结果就是,我们在最大的 Python 库(后端代码)中的注释行数在大约三年之内增长至近 400 万行,这些全都迁移成了静态类型代码。mypy 现在支持多种覆盖报告,能够帮助我们轻松跟踪相关进度。具体来讲,我们可以报告各类不够明确的类型来源——例如在注释中使用的显式、未经检查的类型,或者未进行类型注释的已导入第三方库等。为了在 Dropbox 当中改善类型检查精度,我们还在中央 Python 类型库中为不少流行的开源库提供经过针对性改进的类型定义(即 stub 文件)。

我们实现了(并在后续 PEP 当中标准化了)新的类型系统,旨在为某些惯用的 Python 模式提供更精确的类型。其中一个典型例子正是 TypeDict,其负责提供 JSON 类字典类型。字典当中包含一组固定的字符串键,各个字符串拥有不同的值类型。我们后续还将不断扩展这套类型系统,同时考虑改进对 Python 数字堆栈的支持能力。

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

以下是 Dropbox 在提升注释覆盖率时,设定的核心工作要点:

  • 严格性。逐渐增加了对新代码的严格要求。我们先从较为简单的角度入手,要求为原有文件补充注释。现在,我们则要求在继续补充注释的同时,在新的 Python 文件中使用类型注释。

  • 覆盖率报告。我们每周都会向各团队发送电子邮件报告,旨在统计他们的注释覆盖率,并提供关于最有必要注释的内容的相关建议。

  • 外展。我们与各团队就 mypy 进行交流,以帮助他们快速上手这款新工具。

  • 调查。我们定期进行用户调查以找到最重要的痛点,并竭尽全力解决这些问题(甚至可以发明一种新的语言来加快 mypy 的速度!)。

  • 性能。我们通过 mypy 守护程序与 mypyc 改进了 mypy 性能(p75 获得高达 44 倍的性能提升),从而减少注释流程中的阻碍,并允许用户根据需要扩展类型检查代码库的规模。

  • 编辑器集成。我们为 Dropbox 内部流行的各款编辑器提供了 mypy 运行集成,具体包括 PyCharm、Vim 以及 VS Code 等。这使得注释迭代变得更轻松,也提升了大家为遗留代码做注释的热情。

  • 静态分析。我们编写了一款利用静态分析来推断函数签名的工具。虽然目前它只能处理非常简单的场景,但仍然帮助我们快速提升了注释覆盖范围。

  • 第三方库支持。我们的不少代码都用到了 SQLAlchemy,它使用的很多动态 Python 函数无法由 PEP 484 类型进行直接建模。为此,我们制作了一个 PEP 561 stub 文件包及一款开源 mypy 插件以提供支持。

经验总结

检查 400 万行代码绝非易事,我们在整个过程中遇到不少挑战,当然也犯过错误。下面,我想总结经验教训,希望能给大家带来启示。

文件丢失。起步之初,我们的 mypy 版本只需处理少量内部文件——或者说,从未接触过 build 之外的一切。在添加第一条注释时,文件被隐式添加到 build 当中。如果从 build 外部的模块导入任何内容,则会获得 Any 类型的值——而这些值根本就不会被纳入检查范围。这导致类型分析精度大打折扣,并在迁移早期给我们带来了不少麻烦。虽然现在已经解决了,而且也算是一种典型做法,但在最糟糕的情况下,如果两个孤立的类型检查机制被合并起来,而这两种机制之间又互不兼容,那么我们就必须对注释进行大量更改!回想起来,我们应该尽早将基础库模块添加到 mypy build 中。

注释遗留代码。在刚刚开始时,我们面对着超过 400 万行的现有 Python 代码。很明显,对如此规模的代码进行注释是项浩大的工程。我们编写了一款名为 PyAnnotate 的工具,它能够在运行测试的同时收集类型,并根据类型结果插入类型注释——但最终这款工具并没能得到广泛采用。理由很简单:收集类型的速度很慢,而生成的类型通常也需要大量人为调整。我们也考虑过在每一次 build 测试时对一小部分实时网络请求自动运行这款工具,但考虑到这两种方式都可能带来较大风险,最终只能作罢。

大多数代码都是由代码所有者手动注释。我们提供关于高价值模块与函数的报告,以帮助简化注释流程。那些在数百个位置使用的库模块,自然是注释工作中的优先考量对象;正在被替换的遗留服务同样值得关注。此外,我们还尝试利用静态分析为遗留代码生成静态注释。

导入周期。导入周期(也就是「tangle」或者说纠结周期)的存在令 mypy 提速变得非常困难。我们还需要努力让 mypy 支持来自导入周期的各种习惯。我们最近刚刚完成了一个重大项目的重新设计,最终解决了大多数导入周期问题。这些解决方案实际上源自项目早期研究中使用的 Alore 语言。Alore 的语法使得导入周期的处理变得更轻松。当然,我们也在这种简单的实现中继承了某些限制因素(对 Alore 来说倒不是什么问题)。Python 之所以很难搞定导入周期,是因为其语句当中可能指代多种事物。例如,赋值可能实际上定义了一个类型别名,而且 mypy 在大部分导入周期处理完成之后一直无法检测到该类型。Alore 就不存在这种模糊性。总之,有些早期设计中不经意做出的决定,很可能成为多年之后的痛苦根源!

4 结束语

从早期原型设计到如今对 400 万行代码进行类型检查,这是一段漫长的旅程。在过程当中,我们对 Python 的类型提示进行了标准化,建立起围绕 Python 类型检查发展出的新兴生态系统、为 IDE 与编辑器开发出类型提示支持机制,在多种类型检查器之间进行功能权衡并实现了库支持能力。

虽然在 Dropbox 公司内部,类型检查已经被视为一项必要工作,但我相信就整个社区而言,对 Python 代码进行类型检查仍是种新生事物。当然,我也坚信这种好习惯将不断推广并给更多人带来助益。如果大家还没有在自己的大型 Python 项目中使用类型检查,那么现在就是最好的时机——根据我的交流整理,所有尝试类型检查的开发者都后悔没有早点参与。总而言之,类型检查正帮助 Python 成长为一款更适合大型项目的出色语言。

原文链接:

https://blogs.dropbox.com/tech/2019/09/our-journey-to-type-checking-4-million-lines-of-python/

往期酷玩:

OpenClaw 2026.3.13 踩坑实录:飞书HTTP协议降级Bug与多版本回归问题汇总 摘要:OpenClaw v2026.3.13存在多个严重回归问题,包括飞书API调用协议意外降级为HTTP导致连接失败(#46100)、本地Gateway诊断矛盾(#45504)及设备配对CLI命令失效等。该版本发布流程本身也存在异常,被迫以v2026.3.13-1标签重新发布。建议飞书用户回退至v2026.3.8稳定版,其他用户谨慎升级。本文详细记录了各Bug现象、影响范围及临时解决方案,并梳理了飞书通道的"多版本回归史",指出其根源在于架构变迁和测试覆盖不足。最后提供了包含配置备份、 阅读详情

相关推荐

使用运放构建电压跟随器

运放,是运算放大器的简称 运算放大器是用模拟电子器件(如晶体管,场效应管,二极管等)构成的模拟集成电路,其特点是有很高的放大倍数和抗干扰能力,因此可以被设计成各种用途的派生电路,如电压比较器、窗口电路、波形发生电路等等,其中也有电压跟随器。 电压跟随器是一种具有100%电压负反馈的放大器电路,其特点是输出电压的幅度和极性都与输入电压相同,所以叫跟随器。典型线路如图所示: 运放跟随器有输入阻抗高,而输出阻抗低的特性,一般来说,输入阻抗可以达到几兆欧姆,而输出阻抗低,通常只有几欧姆,甚至更低。 在电

Code for Coffee 5万+

著名云存储网站DropBox疑似被墙(附应对方法)

Dropbox作为一个强大文件网络同步、备份、分享工具深受大家的喜爱,这两天也有很多名博相继发表文章介绍Dropbox以及使用技巧,不幸的是,本着凡是人们喜爱的网络服务就一定要屏蔽的原则,这个优秀的网络服务已经不能正常访问了。不过也不排除是中国刷Dropbox空间的太多而导致 Dropbox屏蔽国内IP如果想继续使用Dropbox,可以参照以下方法方法一:使用代理或VPN,

ren_xing的专栏 2048

港口集装箱码头运营FlexSim仿真

列队4中的集装箱会根据不同类型的集装箱会放置在不同的堆场,因此根据前面对集装箱设置的标签Type的数值不同,设置不同的发送端口。集装箱到达列队3后,会有70%的集装箱到达堆场,30%的集装箱运出港口,因此在Queue列队3的Flow界面设置按照百分比发送端口,其中70%发送到端口1,即发送到列队4等待进入堆场,30%发送到端口2,即发送至出闸口。通过上述对比表格可以看出,当集卡数量在10的时候,岸桥和场桥的设备利用率达到了最高,当集卡数量为12的时候场桥1和场桥3的利用率有所下降,因此综合考虑。

m0_72514516的博客 1331

十几年积累的 300 万行代码,领导要全部“快速”重写,我直接辞职了

LinkedIn 作为全球最大的职业社交平台,拥有数亿用户,其代码库规模也是相当庞大。2019 年时,其前端代码量就达到了 200 万行,构建时间长达 17 分钟。后端还有支持LinkedIn功能、广告销售平台等数以千计的服务。如此庞大的代码量,给维护和更新带来了巨大的挑战。更糟糕的是,由于长期以来为了快速推出新功能而忽视代码质量,导致系统问题频出,开发团队疲于应付:无论在 QA 环节上付出多少努力,都不可能彻底消除隐患。

IT界那些事儿 247

【原创】关于西门子S120 的电气图纸设计

我们首先要了解一下模块的基本信息:SINAMICS 功率模块 PM240-2 三相交流380-480V+10/-10% 47-63Hz;至此,我们选择的驱动系统配置的资料都已经查找完毕,接下来就是根据每个部件的功能接口和我们需要实现的功能画出接线连接图,这样关于伺服电机控制,硬件部分设计就完成了。2)FSA - FSC 型功率模块 PM240-2 的屏蔽连接板外形尺寸图,所有数据以毫米(英寸)为单位。1)FSA 型功率模块 PM240-2 的外形尺寸图,所有数据以毫米(英寸)为单位。

Qinmingyue13的博客 2640

PX4从放弃到精通(十一):混控及PWM输出

文章目录前言一、混控脚本二、使用步骤1.引入库2.读入数据总结 前言 一个人可以走的更快,一群人才能走的更远,交流学习加qq:2096723956 更多保姆级PX4+ROS学习视频:https://b23.tv/ZeUDKqy 分享知识,传递正能量,如有疏漏或不当之处,恳请指出. 一、混控脚本 混控脚本定义了不同 示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。 二、使用步骤 1.引入库 代码如下(示例): import numpy as np import pand

超维空间科技的博客 1万+

Python 定期检查Build_setting的编译情况

  #!/usr/bin/python #_*_ coding:utf-8 _*_ import time from email.MIMEText import MIMEText from email.MIMEMultipart import MIMEMultipart from email.MIMEBase import MIMEBase from email import Utils, E...

weixin_33811961的博客 131

【华为OD技术面试手撕真题】1、长度最小的子数组 | 手撕真题+思路参考+代码解析(C & C++ & Java & Python & JS)(三种解法)

【华为OD面试手撕真题】长度最小的子数组,本专栏更新每年华为OD机试的高频手撕代码题,每个题目都会使用五种语言进行解答(C & C++& Java & Python & JS),思路分析都非常详细, 实现最低的时间复杂度和高通过率,每个解题思路超过百字,内含各个编程语言的八股文面试题,欢迎大家订阅学习, 代码可以直接运行使用,全网限时最低价,持续更新

KJ.JK 1万+

写出高质量代码的10个Tips

转载自: http://www.jianshu.com/p/31b21a0bf1e1 很长一段时间以来,我都在关注如何提高代码质量,也为此做过一些尝试,我想这个话题可能大家会比较感兴趣,在这里分享一下我关于如何提高代码质量的一些体会。 1. 打好基础 写出高质量代码,并不是搭建空中楼阁,需要有一定的基础,这里我重点强调与代码质量密切相关的几点: 掌握好开发语言,比如做A

weizaishouex2010的专栏 466

Tableau学习教程(万字保姆级教程)​​​​​​

​Tableau学习教程(保姆级教材,学不会私信留言来找我) 从BI系统开发的角度来学习tableau工具,更学会报表开发的流程 内含学习使用数据源,tableau打包工作簿,可直接提取使用 ​...

小菜菜的博客 6万+

Algorithm:【算法进阶之路】之算法面试刷题集合—数据结构的简介、最强学习路线(逻辑结构【数组-链表-栈和队列/树-图-哈希】、物理结构【元素/关系】、数据运算【十大排序/四大查找-图三大搜索-

​ Algorithm:【算法进阶之路】之算法面试刷题集合—数据结构的简介、最强学习路线(逻辑结构【数组-链表-栈和队列/树-图-哈希】、物理结构【元素/关系】、数据运算【十大排序/四大查找-图三大搜索-树三大遍历】、高级算法【枚举/回溯/递归/分治/动规/贪心】)、问题为导向的十大类刷题算法总结之详细攻略 目录 相关文章 数据结构思维导图 基本术语 一、数据结构的概述 二、数据的逻辑结构 三、数据的物理结构 四、数据的运算

头部AI社区如有邀博主AI主题演讲请私信—心比天高,仗剑走天涯,保持热爱,奔赴向梦想!低调,专注,谦虚,自律,反思,成长,还算比较正能量的博主,公益免费传播…内心特别想在AI界做出一些可以推进历史进程影响力的技术(兴趣使然,有点小情怀,也有点使命感呀 6849

超详细的typeScript笔记(一)安装配置

文章目录1 安装2 配置3 运行第一个文件 1 安装 cnpm i typescript -g 查看版本 tsc -v 2 配置 基于vscode使用 1 创建.ts文件 2 生成配置文件tsc --init ----- tsconfig.json 3 自动编译配置 1 修改配置文件 2 运行指令 终端-----运行生成文件 3 运行第一个文件 自动生成js文件 浏览器不能编译ts文件 ts能使用ES6以上语法 编译时将ts转换成低级语法 ...

layxing27的博客 406

半导体工艺仿真:离子注入工艺仿真_(8).损伤和缺陷仿真

离子注入工艺在半导体制造中是一个重要的步骤,用于在半导体材料中引入特定的掺杂剂。然而,离子注入过程中不可避免地会产生损伤和缺陷,这些损伤和缺陷会直接影响器件的性能和可靠性。因此,对离子注入工艺中的损伤和缺陷进行仿真研究是必不可少的。本节将详细介绍如何使用仿真软件对离子注入过程中的损伤和缺陷进行建模和分析。

2401_87715305的博客 1339

python能做什么软件?Python到底能干嘛,一文看懂

Python培训有哪些内容?很多零基础学员不知道Python软件是干什么用的?Python软件是Python工程师编写代码时所需要的编辑工具,现在比较常用的Python软件有Visu... 那么在选择Python培训机构时学生尤为关注的就是培训内容,从现在几家大的机构可以看出,Python培训主要学习第一阶段Python核心编程(Pyth... 一文读懂Python内置变量,函数,模块在这里解释下什么是解释性语言什么是编译性语言: 编译性语言:如c++,c等,写好的代码要通过编译器编译成操作系统直接可

小分享 1万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Python可以做什么软件开发,python可以做什么好玩的

Python软件是Python工程师编写代码时所需要的编辑工具,现在比较常用的Python软件有Visu... 那么在选择Python培训机构时学生尤为关注的就是培训内容,从现在几家大的机构可以看出,Python培训主要学习第一阶段Python核心编程(Pyth...什么是面向对象,Python面向对象(一切皆对象)读者肯定听过Python中"一切皆对象"的说法,但可能并不了解它的具体含义,只是在学习的时候听说Python是面向对象的编程语言,本节将向大家详细介绍Python面向对象的含义。

P42695665的博客 756

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

python全系列官方中文文档,python 帮助文档中文版

一篇文章带你了解Python中的游戏开发模块pyglet可以使用还有一种比较Python的方法:恩,但是今天我们要查看的是pyglet的所有方法,所以,dir了解下,用这个内置函数:我们先不看那些带下划线的 查看官方文档可知,而且它的参数貌似还不少:这是我从它的源代码文档中所得的。Python的优点是什么?Python是开源的,并且和GPL兼容。4、 Python是跨平台且开源的,成本小Python是开源的,经过近三十年不断开发,改进并完善,可以跨Linux,Macos,Windows等平台平稳运行。

Rtee1的博客 616

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

python可以做软件开发吗,python可以用来做什么?

Python软件是Python工程师编写代码时所需要的编辑工具,现在比较常用的Python软件有Visu... 那么在选择Python培训机构时学生尤为关注的就是培训内容,从现在几家大的机构可以看出,Python培训主要学习第一阶段Python核心编程(Pyth...什么是面向对象,Python面向对象(一切皆对象)读者肯定听过Python中"一切皆对象"的说法,但可能并不了解它的具体含义,只是在学习的时候听说Python是面向对象的编程语言,本节将向大家详细介绍Python面向对象的含义。

2401_84503581的博客 311

python参考手册中文版,python官方手册中文pdf

一篇文章带你了解Python中的游戏开发模块pyglet可以使用还有一种比较Python的方法:恩,但是今天我们要查看的是pyglet的所有方法,所以,dir了解下,用这个内置函数:我们先不看那些带下划线的 查看官方文档可知,而且它的参数貌似还不少:这是我从它的源代码文档中所得的。Python的优点是什么?Python是开源的,并且和GPL兼容。4、 Python是跨平台且开源的,成本小Python是开源的,经过近三十年不断开发,改进并完善,可以跨Linux,Macos,Windows等平台平稳运行。

2401_84503581的博客 718

python3中文版下载手机版,python3.0中文版下载

一篇文章带你了解Python中的游戏开发模块pyglet可以使用还有一种比较Python的方法:恩,但是今天我们要查看的是pyglet的所有方法,所以,dir了解下,用这个内置函数:我们先不看那些带下划线的 查看官方文档可知,而且它的参数貌似还不少:这是我从它的源代码文档中所得的。Python的优点是什么?Python是开源的,并且和GPL兼容。4、 Python是跨平台且开源的,成本小Python是开源的,经过近三十年不断开发,改进并完善,可以跨Linux,Macos,Windows等平台平稳运行。

w666666Wwwwwww的博客 832

python3开发文档中文版,2022年最新

原创Python图文详解,堪称「最强文档」还有自动化办公、爬虫pdf速下!最近由我原创的 《Python最强-基础学习文档》,开始火爆整个 Python 圈,发布仅一周的时间,下载量将近破万 !为什么这么火?本文档共68页,将Python基础部分讲得细致入微!不论你是学习Python数据分析、Python爬虫,还是Python开发,这都是一个比好多书籍写的都要好的Python基础入门文。 如何部署Jupyter Notebook用于交互式Python开发?【51CTO.com快译】Jupyter No

神经网络爱好者 1591

python能开发小程序吗

一篇文章带你了解Python中的游戏开发模块pyglet可以使用还有一种比较Python的方法:恩,但是今天我们要查看的是pyglet的所有方法,所以,dir了解下,用这个内置函数:我们先不看那些带下划线的 查看官方文档可知,而且它的参数貌似还不少:这是我从它的源代码文档中所得的。Python的优点是什么?Python是开源的,并且和GPL兼容。4、 Python是跨平台且开源的,成本小Python是开源的,经过近三十年不断开发,改进并完善,可以跨Linux,Macos,Windows等平台平稳运行。

obvo0607111的博客 512

python官方中文文档下载,python中文官网下载安装

一篇文章带你了解Python中的游戏开发模块pyglet可以使用还有一种比较Python的方法:恩,但是今天我们要查看的是pyglet的所有方法,所以,dir了解下,用这个内置函数:我们先不看那些带下划线的 查看官方文档可知,而且它的参数貌似还不少:这是我从它的源代码文档中所得的。Python的优点是什么?Python是开源的,并且和GPL兼容。4、 Python是跨平台且开源的,成本小Python是开源的,经过近三十年不断开发,改进并完善,可以跨Linux,Macos,Windows等平台平稳运行。

2401_84504019的博客 374

python中文开发者社区,python3官方文档 中文

一篇文章带你了解Python中的游戏开发模块pyglet可以使用还有一种比较Python的方法:恩,但是今天我们要查看的是pyglet的所有方法,所以,dir了解下,用这个内置函数:我们先不看那些带下划线的 查看官方文档可知,而且它的参数貌似还不少:这是我从它的源代码文档中所得的。Python的优点是什么?Python是开源的,并且和GPL兼容。4、 Python是跨平台且开源的,成本小Python是开源的,经过近三十年不断开发,改进并完善,可以跨Linux,Macos,Windows等平台平稳运行。

wenangou的博客 165

java大数据和javaee哪个好,java与大数据之间的关系

一篇文章带你了解Python中的游戏开发模块pyglet可以使用还有一种比较Python的方法:恩,但是今天我们要查看的是pyglet的所有方法,所以,dir了解下,用这个内置函数:我们先不看那些带下划线的 查看官方文档可知,而且它的参数貌似还不少:这是我从它的源代码文档中所得的。Python的优点是什么?Python是开源的,并且和GPL兼容。4、 Python是跨平台且开源的,成本小Python是开源的,经过近三十年不断开发,改进并完善,可以跨Linux,Macos,Windows等平台平稳运行。

2401_85415521的博客 500
上一篇: 我最佩服的一位大佬!他在腾讯工作十年!
下一篇: 程序员相亲图鉴
菜鸟学Python
博客等级 码龄9年 8062粉丝 571原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值