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.
实现这一目标最优雅的方式是什么?我宁愿不使用命名参数.
通常你要么定义两个不同的函数,要么做类似的事情:
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)).当然,由于必须创建一个对象,因此性能成本很低.
您可以使用默认参数,但如果您想在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,它包含装饰器,如重载.如果它是在方法上,那么将为所有重载方法调用此方法.
| 归档时间: |
|
| 查看次数: |
1936 次 |
| 最近记录: |