热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

这个问题来自于thisquestion:deffringe8((px,py),(x1,y1,x2,y2)):就个人

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


推荐阅读
author-avatar
曾经
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有