作者:曾经 | 来源:互联网 | 2023-10-12 08:31
这个问题来自于this question:
def fringe8((px, py), (x1, y1, x2, y2)):
就个人而言,看到一个带有固定数量迭代(如元组)或两个或更多字典的两个参数的函数(如Shotgun API中)是我的烦恼之一.它很难使用,因为所有的冗长和双括号外壳.
这不会更好:
>>> class Point(object):
... def __init__(self, x, y):
... self.x = x
... self.y = y
...
>>> class Rect(object):
... def __init__(self, x1, y1, x2, y2):
... self.x1 = x1
... self.y1 = y1
... self.x2 = x2
... self.y2 = y2
...
>>> def fringe8(point, rect):
... # ...
...
>>>
>>> point = Point(2, 2)
>>> rect = Rect(1, 1, 3, 3)
>>>
>>> fringe8(point, rect)
是否存在采用两个或更多可迭代参数的情况?显然,标准的itertools Python库需要它,但我看不出它在可维护,灵活的代码设计中非常漂亮.
解决方法:
带解压缩的def语法,如
def fringe8((px, py), (x1, y1, x2, y2)):
在Python 3中消失了 – 这意味着Guido认为这是一个设计错误,或者至少是一个无根据的复杂问题.为了您建议的澄清目的,命名元组可能甚至比专用类更好.
但是,拥有带有多个可迭代参数的函数非常合适 – 当然,itertools显然不能封装应用程序可能需要的每个多次迭代操作!将迭代视为“流”(可能是无限制的),有很多种方法可以将多个流“合并”为一个,例如(例如,考虑已知要排序的流和你可能想要建立交集,或者联合,有或没有删除重复等等).
为什么人们应该歪曲一个人的API的设计,以遵守关于每个函数签名不超过一次迭代的完全任意禁令?!