Python中的函数重载:缺失

Xol*_*lve 61 python overloading missing-features

如上所述:

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

Python中没有函数重载.

据我所知,这也是一个很大的障碍,因为它也是一种OO语言.最初我发现无法区分参数类型很困难,但Python的动态特性使其变得容易(例如,列表,元组,字符串非常相似).

然而,计算传递的参数数量然后完成工作就像是一种矫枉过正.

var*_*tec 36

现在,除非您尝试使用Python语法编写C++代码,否则您需要重载什么?

我认为这恰恰相反,重载只是使强类型语言更像Python的必要条件.在Python中你有关键字参数,你有*args**kwargs.

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

  • 您对超载是"残障语言的黑客工作"的评估似乎过于极化,忽视了静态类型的好处,以及它对不同类型部署的适用性.[Stefano Borini的回答](http://stackoverflow.com/a/733385/322333)_"..函数重载是基于传递不同类型的想法,你将执行不同的代码.如果你有一个动态类型的语言,如python,你不应该通过类型来区分"_我认为更有用,更有帮助. (59认同)
  • 当然,您也可以在C++中使用变量参数,但是重载用于保持代码*clean*.就像在一样,一个函数做一件事而不是让一个函数乱七八糟的if语句试图根据传入的内容弄清楚要做什么. (10认同)

Rya*_*rom 33

正如unwind所述,具有默认值的关键字参数可以有很长的路要走.

我还要声明,在我看来,与许多类型传递给方法相比,它违背了Python的精神.在Python中,我认为使用duck typing更容易接受 - 询问对象可以做什么,而不是它是什么.

因此,如果您的方法可能接受字符串或元组,您可能会执行以下操作:

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
Run Code Online (Sandbox Code Playgroud)

然后你可以做以下任何一个:

print_names("Ryan Billy")
print_names(("Ryan", "Billy"))
Run Code Online (Sandbox Code Playgroud)

虽然这样的API有时表示设计问题.

  • 然后请一个没有设计问题的例子. (37认同)

Ste*_*ini 22

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

事实是,函数重载是基于传递不同类型的想法,您将执行不同的代码.如果你有像python这样的动态类型语言,你不应该按类型区分,但是你应该处理接口及其对你编写的代码的遵从性.

例如,如果你有可以处理整数或整数列表的代码,你可以尝试迭代它,如果你不能,那么你假设它是一个整数并继续前进.当然它可能是一个浮点数,但就行为而言,如果float和int看起来是相同的,那么它们可以互换.

  • 重载不是严格的类型,也是关于参数的数量.例如,我可能希望我的访问器和mutator(或者"getter"和"setter",如果你愿意的话)共享一个方法名称,但是他们显然根据参数的存在做了不同的事情.这与论证的类型无关. (6认同)

unw*_*ind 6

通常,您会看到建议使用use keyword arguments,而使用默认值.看看那个.


Lak*_*sad 6

您可以将可变容器数据类型传递给函数,它可以包含您想要的任何内容.

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

我花了一段时间来调整来自Java的这个,但它确实不是一个"大障碍"