这个问题来自于观察this question:
def fringe8((px, py), (x1, y1, x2, y2)):
就我个人而言,看到一个函数使用两个固定数目的iterable参数(如元组)或两个或更多字典(如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库需要这个,但是我看不出它在可维护的、灵活的代码设计中是很漂亮的。
最佳答案
带有unpacking的def
语法,如
def fringe8((px, py), (x1, y1, x2, y2)):
在Python3中消失了——这意味着Guido认为这是一个设计错误,或者至少是一个不必要的复杂问题。命名元组可能比特殊用途的类更好,以便于说明您所建议的用途。
然而,拥有带有多个iterable参数的函数是非常好的--
itertools
显然不能封装应用程序可能需要的每个多iterable操作,当然!将iterable视为“一个流”(可能是一个无边界的流),有很多种方法可以让您将多个流“合并”为一个流,例如(例如,考虑已知要排序的流,并且您可能希望在删除或不删除重复项的情况下建立交叉点或联合点等)。为什么要扭曲自己的api设计,以遵守一个完全任意的禁令,即每个函数签名不能超过一个iterable?啊!
关于python - 我不喜欢带有两个或多个可迭代对象的Python函数。这是个好主意吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2838965/