Python中的函数重载:Missing

正如这样说:

http://web.archive.org/web/20090624083829/http://mail.python.org/pipermail/python-list/2003-May/206149.html

Python中没有函数重载。

就我觉得这是一个很大的障碍,因为它也是面向对象语言。 最初我发现无法区分参数types是困难的,但是Python的dynamic性使它变得容易(例如,列表,元组,string非常相似)。

然而,通过参数的数量,然后做这个工作就像一个矫枉过正的事情。

正如unwind所指出的那样,带有默认值的关键字参数可以走很长的路。

我也会说,在我看来,它违背了Python的精神,很担心什么types被传入方法。 在Python中,我认为用鸭子打字更容易 – 询问对象可以做什么,而不是什么。

因此,如果你的方法可能接受一个string或元组,你可能会这样做:

def print_names(names): """Takes a space-delimited string or an iterable""" try: for name in names.split(): # string case print name except AttributeError: for name in names: print name 

那么你可以做任何一个这样的:

 print_names("Ryan Billy") print_names(("Ryan", "Billy")) 

虽然这样的API有时会表示devise问题。

现在,除非你想用Python语法编写C ++代码,否则你需要重载的是什么?

我认为这完全相反,重载只是使强types语言更像Python一样行事。 在Python中你有关键字参数,你有*args**kwargs

例如,请参阅: 在Python中有多个构造函数的干净,pythonic方法是什么?

你不需要函数重载,因为你有* args和** kwargs参数。

事实是,函数重载是基于这样的想法,即传递不同的types,你将执行不同的代码。 如果你有一个像python这样的dynamictypes的语言,你不应该通过types来区分,但是你应该处理接口以及它们与你编写的代码的兼容性。

例如,如果您的代码可以处理整数或整数列表,您可以尝试对其进行迭代,如果无法处理,则假定它是一个整数并继续前进。 当然,这可能是一个浮点数,但就行为而言,如果float和int看起来是相同的,那么它们可以互换。

通常情况下,您会看到build议使用use关键字参数,而使用默认值。 看看那个。

你可以将一个可变的容器数据types传递给一个函数,它可以包含任何你想要的东西。

如果您需要不同的function,请以不同的方式命名函数,或者如果U需要相同的接口,则只需编写一个接口函数(或方法),根据收到的数据适当地调用函数。

我花了一段时间来调整这个来自Java的,但它真的不是一个“大缺陷”