在python中"重载"函数的最佳方法?

chw*_*chw 3 python overloading

我想在python中做这样的事情:

def foo(x, y):
    # do something at position (x, y)

def foo(pos):
    foo(pos.x, pos.y)
Run Code Online (Sandbox Code Playgroud)

所以我想根据我提供的参数数量调用不同版本的foo.这当然不起作用,因为我重新定义了foo.

实现这一目标最优雅的方式是什么?我宁愿不使用命名参数.

Ste*_*sop 5

通常你要么定义两个不同的函数,要么做类似的事情:

def foo(x, y = None):
    if y is None:
        x, y = x.x, x.y
    # do something at position (x, y)
Run Code Online (Sandbox Code Playgroud)

如果你已经习惯了有重载的语言,那么定义两个不同函数的选项看起来很笨拙,但是如果你习惯于像Python或C这样的语言,那么它就是你所做的.Python中上述代码的主要问题是记录第一个参数有点尴尬,在两种情况下并不一样.

另一个选择是定义foo一个pos 的版本,但也为用户提供一个类型:

Pos = collections.namedtuple('Pos', 'x y')
Run Code Online (Sandbox Code Playgroud)

然后任何foo(x,y)想写的人都可以写作foo(Pos(x,y)).当然,由于必须创建一个对象,因此性能成本很低.


sza*_*rad 5

您可以使用默认参数,但如果您想在python中使用重载,最好的方法是:

from pytyp.spec.dispatch import overload

@overload
def foo(x,y):

@foo.overload
def foo(x, y,z):
Run Code Online (Sandbox Code Playgroud)

Pytyp是一个python包(你可以从https://pypi.python.org/pypi/pytyp下载它).它包括模块pytyp.spec.dispatch,它包含装饰器,如重载.如果它是在方法上,那么将为所有重载方法调用此方法.