一种用于从C++迁移到 Python 的技术,用于减少缺少标识符声明的影响

A technique for a C++-to-Python migrant to lessen the impact of missing identifier declarations

本文关键字:用于 技术 影响 声明 标识符 一种 迁移 C++ Python      更新时间:2023-10-16

在举一个具体的例子之前,让我提一下这个问题。作为一个在C++方面拥有丰富经验的初级 Python 程序员,我总是缺少变量声明。我可以屈服于记录每个重要标识符类型的诱惑,但我有一种感觉,这不会是非常pythonic的。首先,解释器和任何工具都不解析这些非正式声明是愚蠢的。如果口译员这样做了,那将是一种完全不同的语言。

作为仅编写注释的替代方法,我正在考虑切换到创建数据类型的模式,其唯一目的是强制执行类型/接口。它们会简化代码,让我在早期阶段检测类型错误。为了方便起见,我将从间接中付出一点效率损失。

例如,为了避免将注释"按 employeeID 索引的 Employee 对象字典"编写,我将编写一个名为"EmployeeDict"的包装类,其接口将限制可以/不能执行的操作。

从长远来看,这样的想法会成功吗?它是否以某种方式击败了Python的精神?它是否被经验丰富的Pythonistas使用?

对于那些熟悉C++的人,换句话说,我会翻译

typedef std::map<EmployeeId, Employee> MyMap;

成一个类型。(尽管我实际上并没有移植任何代码。

更新

即使它是非物理的,正如HumphreyTriscuit所证实的那样,我也不愿意写出被人类阅读的评论,而不会自动化一点类型检查。很高兴这个问题在 3.5 中得到解决,但我暂时停留在 2.7 中,所以我会将 jsbueno 的答案标记为正确,直到有人可以提出一种方法——à la "assert isinstance(param, dict)",但也简洁地确认了键/值的类型,有点平行C++——在 2.7 中解决这个问题。

实际上,从 Python 3.5 开始,该语言捆绑了用于参数类型注释的工具,这些工具可以被第三方工具自省 - 其中 tehre 可能已经存在一些 ut。

无论如何,看看 https://www.python.org/dev/peps/pep-0484/

即使您不使用任何其他工具 - 上面 PEP 484 中描述的方式是声明类型的"Pythonic 方式",不会与其他第三方工具冲突。因此,如果您想按照您的描述编写工具链,您应该首先使用该 PEP 中所述的函数注释进行创建。

这对于记录(如果是这种情况,则进行加密)、参数和返回值很有帮助。对于类属性,您可以查看我的这个答案,基于在层次结构的 abse 类上制作一个特殊的__setitem__方法:

强制 python 类成员变量为特定类型

至于局部变量 - 没有办法强制执行/检查它们的类型,而是代码注释。

最后一个建议是让你"走上Python之路",记住要宽容并检查接口,而不是特定的类。