python - 我不喜欢带有两个或多个可迭代对象的Python函数。这是个好主意吗?

标签 python function iterable code-design

这个问题来自于观察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/

相关文章:

python - 输入两个单独的列表并输出单个字典列表

linux - bash 函数中的命令引用

javascript - 使用文本输入字段时出现 Javascript 中的 NaN

python - 从两个数组创建所有可能的组合

java - 过滤泛型类型列表

string - 禁止将字符串处理为可迭代的

python - 如何在Python中使用随机哈希函数?

python - 在keras中弹出上层

python - 请求遍历字典中的每一行: how to fix

javascript - 替换 JavaScript 中的函数