在C++中,只要函数签名不同,就可以创建两个具有相同名称的函数。例如,
myfunc(int x)
与myfunc(float x)
是不同的。
但在Python中,您无法这样做,因此需要定义具有不同名称的函数,或者有更好的方法来处理这种情况吗?functools.singledispatch
装饰器,它允许您定义通用函数,然后针对它注册类型实现。从文档中了解更多信息。>>> from functools import singledispatch
>>> @singledispatch
... def fun(arg, verbose=False):
... if verbose:
... print("Let me just say,", end=" ")
... print(arg)
类型化函数:
>>> @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)
对于较早版本的Python,没有内置的解决方案,但Guido van Rossum在博客中介绍了一种使用装饰器的python2解决方案。(编辑:也有一个针对Python 2.6-3.3的3.4功能的后移版本在pypi上)
编辑: 当然,使用Python的优点之一是相同的代码通常可以处理整数和浮点数,而无需显式调度类型,这也是为什么该功能最近才被添加的原因之一。
Python并不在意一个参数是整数还是浮点数。它是动态类型的。例如,你可以这样做:
def SquareMe(num):
return num**2
您可以使用任何数字(int
,float
,complex
等)调用此函数。
还可以这样做:
def MultMe(data):
return data*2
在Python中,您只需创建一个方法,但您可以检查可传递的参数以及它们是否不同(即:一个是浮点数,另一个是整数),然后您可以区分两个函数。在代码中,这看起来像:
def myfunc(*args):
# do something
# when you call the method
myfunc(a1, a2, k1=a3, k2=a4)
# you get:
args = (a1, a2)
kwds = {'k1':a3, 'k2':a4}
#So now lets recreate myfunc to check arguments
def myfunc(*args):
if isinstance(args[0], str): #This is where you determine argument type
# do what you want to do if argument is string
elif isinstance(args[1], int):
# do what you want to do if argument is an int
def myfunc(x):
if(isinstance(x,int)):
print (x, 'int') # as myfunc(int x)
if(isinstance(x,float)):
print (x, 'float') # as myfunc(float x)
myfunc(10) # 10 int
myfunc(10.2) # 10.2 float
myfunc ("A") #
根据参数的类型和数量,您可以让函数本身执行不同的操作。
def f (a):
if type (a) == 'float' or type (a) == 'int':
...
if type (a) == 'list':
...
if type (a) == 'dict':
...
type(6)
时返回<type 'int'>
。因此,你可能无法轻松地将type
的返回值与这样的字符串进行比较。 - ForceBru
myfunc
对于x
的操作无论它是int
还是float
都是相同的,那么你只需要一个函数。如果你希望它对x
根据其类型执行不同的操作,则通常最好有两个不同名称的函数,尽管如果你真的想要的话,也可以确定参数的类型并相应地做出响应。 - PM 2Ring