繁体   English   中英

Duck在Python 3中键入和接受元组或整数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM