翻译:《实用的 Python 编程》03_06_Design_discussion
目录 | [上一节 (3.5 主模块)] | [下一节 (4 类)]
3.6 设计讨论
本节,我们重新考虑之前所做的设计决策。
文件名与可迭代对象
考虑以下两个返回相同输出的程序。
你更倾向于使用哪个函数?为什么?
哪个函数更灵活?
鸭子类型(Duck Typing)
在计算机程序设计中,鸭子类型 用于确定一个对象是否可用于特定目的。这是 [鸭子测试](https://en.wikipedia.org/wiki/Duck_test) 的一种应用。
如果它看起来像鸭子、游泳像鸭子、叫声像鸭子,那么它可能就是只鸭子。
上述第二个 read_data()
函数接受任何可迭代对象,而不仅是文件行。
这意味着我们可以使用它处理其它的行(lines)。
这种设计具有很大的灵活性。
问题:我们应该拥抱还是反对这种灵活性?
库设计最佳实践
通常,拥抱灵活性可以更好的服务于代码库。不要限制你的选择,灵活性大,带来的威力也大。
练习
练习 3.17:从文件名到类文件对象
现在,你已经创建了一个包含 parse_csv()
函数的 fileparse.py
文件。parse_csv()
函数像下面这样工作:
虽然函数接受的是一个文件名,但是,你可以使代码更具灵活性。请求修改函数,以便它可以接受任何类文件或者可迭代对象。例如:
在新的代码中,如果像以前一样传递一个文件名会发生什么?
正如上面代码显示的那样,这可能带来意想不到的结果,所以,修改的时候需要小心一些。你可以添加安全检查来避免这种情况吗?
练习 3.18:修复(fix)现有函数
请修复 report.py
文件中的 read_portfolio()
和 read_prices()
函数。以便它们可以使用修改后的 parse_csv()
函数。这应该只涉及较小的修改。之后,report.py
和 pcost.py
程序应能够像以往一样工作。
目录 | [上一节 (3.5 主模块)] | [下一节 (4 类)]
注:完整翻译见 https://github.com/codists/practical-python-zh
版权声明: 本文为 InfoQ 作者【codists】的原创文章。
原文链接:【http://xie.infoq.cn/article/288ce70a965a6a9fcec150a07】。文章转载请联系作者。
评论