我有一个很大的现有程序库,目前有一个.NET绑定,我正在考虑编写一个Python绑定。现有的API广泛使用基于签名的重载。因此,我收集了大量静态函数,例如:
Circle(p1, p2, p3) -- Creates a circle through three points
Circle(p, r) -- Creates a circle with given center point and radius
Circle(c1, c2, c3) -- Creates a circle tangent to three curves
在一些情况下,相同的输入必须以不同的方式使用,因此基于签名的重载不起作用,因此我不得不使用不同的函数名。例如
^{pr2}$我想第二种技术(使用不同的函数名)可以在pythonapi中的任何地方使用。所以,我会的
CircleThroughThreePoints(p1, p2, p3)
CircleCenterRadius(p, r)
CircleTangentThreeCurves(c1, c2, c3)
但是这些名称看起来冗长得令人不快(我不喜欢缩写),而且发明所有这些名称将是一个相当大的挑战,因为这个库有数千个函数。在
低优先级:
努力(就我而言)--我不在乎是否要写很多代码。
性能
高优先级:
方便呼叫者使用/理解(许多人将是编程新手)。
我很容易写出好的文档。
简单——避免在调用方代码中使用高级概念。在
我确信我不是第一个希望在Python中实现基于签名的重载的人。人们通常使用哪些变通方法?在
你可以用字典,像这样
初始化者会说
^{pr2}$一种选择是在构造函数中独占关键字参数,并包含逻辑来确定应该使用什么:
您还可以使用classmethods为API用户简化操作:
^{pr2}$用法:
有几个选择。在
您可以有一个构造函数,它接受任意数量的参数(使用
*args
和/或**varargs
语法),并根据参数的数量和类型执行不同的操作。在或者,您可以将二级构造函数编写为类方法。这些被称为“工厂”方法。如果有多个构造函数使用相同数量的相同类的对象(如您的
BezierCurve
示例),这可能是您唯一的选择。在如果您不介意重写
__new__
而不是__init__
,您甚至可以同时使用这两种方法,__new__
方法本身处理一种形式的参数,并将其他类型引用到工厂方法进行正则化。下面是一个可能的示例,包括__new__
的多个签名的doc字符串:相关问题 更多 >
编程相关推荐