[英]Duck Typing and acceptance of tuples or integers in Python 3
我正在使用一个外部(公共域)库,它在屏幕上显示一个tilemap。 我试图避免使用if ... then ... elif的长链来使用lambda
语句的dict
进行输入处理,该语句将在按下键(作为dict的键)和当前的情况下适当地调整视口视口的x,y位置。
lambdas在元组中返回修改后的x和y坐标,但是设置视口的函数(我意识到应该使用@property
来处理它,但是代码已经存在并且重新构造会非常痛苦)将其参数作为单独的x和y作为整数。
我可以通过在函数顶部附近插入以下内容来接受元组:
if isinstance(fx,tuple):
fx, fy = fx
但是如果我们想成为超级Pythonic来惹恼原始的库开发人员,那就不行了 - 鸭子打字范例表明任何可以包含x和ay值的对象都应该是可以接受的。
我该如何实现?
使用*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
现在您不必调整视口函数来获取元组以及单独的参数。
另一种方法是使第二个坐标成为关键字参数:
def viewport_set(x, y=None):
if y is None:
# assume x is a sequence of two coordinates instead
x, y = x
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.