我不喜欢采用两个或更多迭代的Python函数.这是个好主意吗?

这个问题来自于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的设计,以遵守关于每个函数签名不超过一次迭代的完全任意禁令?!

上一篇:Python之Iterable(可迭代对象)


下一篇:Ubuntu18.04关闭内核自动更新