Python中的函数签名

4
在C++中,只要函数签名不同,就可以创建两个具有相同名称的函数。例如,myfunc(int x)myfunc(float x)是不同的。 但在Python中,您无法这样做,因此需要定义具有不同名称的函数,或者有更好的方法来处理这种情况吗?

1
如果 myfunc 对于 x 的操作无论它是 int 还是 float 都是相同的,那么你只需要一个函数。如果你希望它对 x 根据其类型执行不同的操作,则通常最好有两个不同名称的函数,尽管如果你真的想要的话,也可以确定参数的类型并相应地做出响应。 - PM 2Ring
5个回答

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)

类型化函数:

>>> @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的优点之一是相同的代码通常可以处理整数和浮点数,而无需显式调度类型,这也是为什么该功能最近才被添加的原因之一。


5

Python并不在意一个参数是整数还是浮点数。它是动态类型的。例如,你可以这样做:

def SquareMe(num):
    return num**2

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

还可以这样做:

def MultMe(data):
    return data*2

这将适用于数字、字符串(!)、列表(!!)、NumPy数组和任何可以乘以数字的东西(如果某个类提供了这样的方法)。

有时候你可能需要做不同的事情,尽管结果是True。例如,如果你传入一个字符串而不是一个浮点数。 - user

1

在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

在这里,如果参数是某种类型(例如字符串),您实际上会得到一个布尔值。 - Vasanth Sadhasivan

1
正如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") # 

0

根据参数的类型和数量,您可以让函数本身执行不同的操作。

def f (a):
     if type (a) == 'float' or type (a) == 'int':
             ...
     if type (a) == 'list':
             ...
     if type (a) == 'dict':
             ...

1
我的Python 2.7版本在执行type(6)时返回<type 'int'>。因此,你可能无法轻松地将type的返回值与这样的字符串进行比较。 - ForceBru

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接