python 中的函数签名

use*_*ser 4 c++ python

在 C++ 中,只要签名不同,就可以创建两个同名的函数。所以 examplemyfunc(int x)不同于myfunc(float x). 在Python中你不能这样做,那么,你是否需要定义不同名称的函数,或者有更好的方法来处理这种情况吗?

For*_*Bru 5

Python 并不真正关心参数是整数还是浮点数。它是动态类型的。例如,您可以这样做:

def SquareMe(num):
    return num**2
Run Code Online (Sandbox Code Playgroud)

您可以使用任何数字(intfloatcomplex、 ...)来调用此函数。

也可以这样做:

def MultMe(data):
    return data*2
Run Code Online (Sandbox Code Playgroud)

这适用于数字、字符串 (!)、列表 (!!)、NumPy 数组以及任何可以乘以数字的内容(如果某个类为此提供了方法)。


sna*_*erb 5

在 Python3.4+ 中,您可以使用functools.singledispatch装饰器,它允许您定义泛型函数,然后针对它注册类型化实现。

来自文档

通用函数:

>>> from functools import singledispatch
>>> @singledispatch
... def fun(arg, verbose=False):
...     if verbose:
...         print("Let me just say,", end=" ")
...     print(arg)
Run Code Online (Sandbox Code Playgroud)

类型化函数:

>>> @fun.register(int)
... def _(arg, verbose=False):
...     if verbose:
...         print("Strength in numbers, eh?", end=" ")
...     print(arg)
...

>>> @fun.register(list)
... def _(arg, verbose=False):
...     if verbose:
...         print("Enumerate this:")
...     for i, elem in enumerate(arg):
...         print(i, elem)
Run Code Online (Sandbox Code Playgroud)

对于早期版本的 Python 没有内置解决方案,但 Guido van Rossum 在博客中介绍了使用装饰器的 python2 解决方案。(编辑: pypi上的 pythons 2.6 - 3.3 也有 3.4 功能的反向移植)

编辑:当然,使用 Python 的优点之一是相同的代码通常可以处理整数和浮点数,而无需显式分派类型,这也是最近才添加该功能的原因之一。