我正在使用一个外部(公共域)库,它在屏幕上显示一个tilemap。我试图避免使用长链的if...then...elif进行输入处理,方法是使用dict of lambda语句,根据按下的键(作为dict的键)和视图端口的当前x,y位置,适当地调整视图端口。
lambdas以元组的形式返回修改后的x和y坐标,但是设置viewport的函数(我认识到应该使用@property来处理这个函数,但是代码已经存在,重新构造会很痛苦)将它的参数作为独立的x和y作为整数。
通过在函数顶部插入以下内容,可以使它接受一个元组:
if isinstance(fx,tuple):
fx, fy = fx但是,如果我们想成为超级Pythonic来激怒最初的库开发人员,这是行不通的--鸭子类型范式表明,任何可以包含x和y值的对象都应该是可以接受的。
我将如何实现这一点?
发布于 2013-12-23 18:33:00
使用对viewport函数的*params调用:
coordinates = lambda_mapping[key](argument)
viewport_set(*coordinates)这将coordinates元组作为单独的参数应用于viewport_set()函数。
演示:
>>> def foo(x, y):
... print(x, y)
...
>>> coordinates = (42, 38)
>>> foo(*coordinates)
42 38现在,您不必调整viewport函数以获得元组和单独的参数。
另一种选择是将第二个坐标设为关键字参数:
def viewport_set(x, y=None):
if y is None:
# assume x is a sequence of two coordinates instead
x, y = xhttps://stackoverflow.com/questions/20749111
复制相似问题