python中的函数签名 在C++中,只要签名不同,就可以创建两个同名函数。 例如myfunc(intx)不同于myfunc(float x)。 在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

python并不真正关心参数是整数还是浮点。它是动态类型的。例如,您可以执行以下操作:

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,您实际上会得到一个布尔值,但有时您可能需要执行不同的操作。例如,如果传入字符串而不是浮点。