在我们涵盖7个PyPI库的系列中了解有关解决Python问题的更多信息。Python是当今最流行的编程语言之一,因为:它是开源的,用途广泛(例如网络编程、商业应用程序、游戏、科学编程等),它由充满活力的并致力于社区吧。这个社区是我们在Python包索引(PyPI)中提供如此庞大、多样化的包集、扩展和改进Python的原因。并解决不可避免的问题。在本系列中,我们将介绍七个PyPI库,它们可以帮助您解决常见的Python问题。今天,我们将了解singledispatch,这是一个可让您追溯向Python库添加方法的库。singledispatch假设您有一个“形状”库,其中包含Circle、Square等类。Circle类有半径,Square有边,Rectangle有高度和宽度。我们的图书馆已经存在,我们不想改变它。但是,我们想在库中添加一个面积计算。如果我们不打算与其他人共享库,我们可以只添加area方法,这样我们就可以调用shape.area()而无需关心它是什么形状。虽然可以进入一个类并添加一个方法,但这是一个坏主意:没有人希望他们的类添加新方法,并且程序会以奇怪的方式出错。相反,functools中的singledispatch函数可以帮助我们。@singledispatchdefget_area(shape):raiseNotImplementedError("cannotcalculateareaforunknownshape",shape)get_area函数的“基类”实现会报错。这确保如果我们有一个新的形状,我们将明确报告错误而不是返回无意义的结果。@get_area.register(Square)def_get_area_square(shape):returnshape.side**2@get_area.register(Circle)def_get_area_circle(shape):returnmath.pi*(shape.radius**2)这个方法好问题是,如果有人编写了一个与我们的代码匹配的新形状,他们可以自己实现get_area。fromarea_calculatorimportget_area@attr.s(auto_attribs=True,frozen=True)类椭圆:水平轴:浮动垂直轴:浮动@get_area。register(Ellipse)def_get_area_ellipse(shape):返回math.pi*shape.horizo??ntal_axis*shape。vertical_axis调用get_area很简单。print(get_area(shape))这意味着我们可以在不修改界面的情况下通过这种方式修改很多ifisintance()/elifisinstance()代码。下次你想修改ifisinstance时,试试`singledispatch!在本系列的下一篇文章中,我们将介绍tox,一种用于自动测试Python代码的工具。
