在 C++ 中,只要签名不同,就可以创建两个同名的函数。所以 examplemyfunc(int x)不同于myfunc(float x). 在Python中你不能这样做,那么,你是否需要定义不同名称的函数,或者有更好的方法来处理这种情况吗?
Python 并不真正关心参数是整数还是浮点数。它是动态类型的。例如,您可以这样做:
def SquareMe(num):
return num**2
Run Code Online (Sandbox Code Playgroud)
您可以使用任何数字(int、float、complex、 ...)来调用此函数。
也可以这样做:
def MultMe(data):
return data*2
Run Code Online (Sandbox Code Playgroud)
这适用于数字、字符串 (!)、列表 (!!)、NumPy 数组以及任何可以乘以数字的内容(如果某个类为此提供了方法)。
在 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 的优点之一是相同的代码通常可以处理整数和浮点数,而无需显式分派类型,这也是最近才添加该功能的原因之一。
| 归档时间: |
|
| 查看次数: |
3768 次 |
| 最近记录: |