python中的函数签名 在C++中,只要签名不同,就可以创建两个同名函数。 例如myfunc(intx)不同于myfunc(float x)。 在python中,您无法做到这一点,因此,您是否需要定义具有不同名称的函数,或者是否有更好的方法来处理这种情况?
python并不真正关心参数是整数还是浮点。它是动态类型的。例如,您可以执行以下操作:python中的函数签名 在C++中,只要签名不同,就可以创建两个同名函数。 例如myfunc(intx)不同于myfunc(float x)。 在python中,您无法做到这一点,因此,您是否需要定义具有不同名称的函数,或者是否有更好的方法来处理这种情况?,python,c++,Python,C++,python并不真正关心参数是整数还是浮点。它是动态类型的。例如,您可以执行以下操作: def SquareMe(num): return num**2 你可以用任何数字调用这个函数 也可以这样做: def MultMe(data): return data*2 这将适用于数字、字符串(!)、数组(!!)和任何可以与数字相乘的对象(如果某个类提供了一个方法)。在python中,您只需创建一个方法,但您可以检查可以传递的参数,以及它们是否是不同的参数(即:一个是浮点,另一个是i
def SquareMe(num):
return num**2
你可以用任何数字调用这个函数
也可以这样做:
def MultMe(data):
return data*2
这将适用于数字、字符串(!)、数组(!!)和任何可以与数字相乘的对象(如果某个类提供了一个方法)。在python中,您只需创建一个方法,但您可以检查可以传递的参数,以及它们是否是不同的参数(即:一个是浮点,另一个是int)然后可以区分两个函数。在代码中,这看起来像:
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 f (a):
if type (a) == 'float' or type (a) == 'int':
...
if type (a) == 'list':
...
if type (a) == 'dict':
...
在Python3.4+中,您可以使用
functools.singledispatch
decorator,它允许您定义一个泛型函数,然后针对它注册类型化实现
从
通用功能:
>>> 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解决方案。(编辑:pythons 2.6-3.3上还有一个3.4功能的后端口)
编辑:
当然,使用Python的优点之一是,相同的代码通常可以处理int和float,而无需对类型进行显式分派,这也是为什么最近才添加此功能的原因之一。正如ForceBru所说,Python并不真正关心参数类型,因此如果您关心,您可以自己处理它:
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") #
如果
myfunc
对x
执行相同的操作,无论它是int
还是float
,那么您只需要一个函数。如果您希望它根据其类型对x
执行不同的操作,那么通常最好使用两个不同的函数和两个不同的名称,尽管可以确定arg的类型并做出相应的响应(如果您真的愿意)。我的Python 2.7给出了
作为类型(6)
的结果。因此,您可能无法轻松地将type
的返回值与此类字符串进行比较。在这里,如果参数的类型为string.True,您实际上会得到一个布尔值,但有时您可能需要执行不同的操作。例如,如果传入字符串而不是浮点。