我有一个返回列表或元组的方法.在参数中表示返回类型的最pythonic方式是什么?
def names(self, section, as_type=()):
return type(as_type)(([m[0] for m in self.items(section)]))
Run Code Online (Sandbox Code Playgroud)
Tim*_*ker 29
pythonic方式根本不关心类型.返回一个元组,如果调用函数需要一个列表,则让它调用list()结果.反之亦然,无论哪种更有意义作为默认类型.
更好的是,让它返回一个生成器表达式:
def names(self, section):
return (m[0] for m in self.items(section))
Run Code Online (Sandbox Code Playgroud)
现在调用者得到一个懒惰评估的迭代.然后他可以决定迭代它:
for name in obj.names(section):
...
Run Code Online (Sandbox Code Playgroud)
或者从头开始创建一个列表或元组- 他永远不必将现有列表更改为元组,反之亦然,因此在所有情况下这都是有效的:
mylist = list(obj.names(section))
mytuple = tuple(obj.names(section))
Run Code Online (Sandbox Code Playgroud)
把事情简单化:
def names(self, section):
"""Returns a list of names."""
return [m[0] for m in self.items(section)]
Run Code Online (Sandbox Code Playgroud)
如果调用者想要一个元组而不是列表,他会这样做:
names = tuple(obj.names(section))
Run Code Online (Sandbox Code Playgroud)
大多数情况下,返回调用者想要的任何内容。如果他们希望能够排序、删除或删除项目等,那么可以使用列表。如果他们想将其用作字典键,请使用元组。如果主要用途是迭代,则返回一个迭代器。如果这对调用者来说并不重要(这种情况不会比您想象的更频繁),那么返回使代码最简单的任何内容。通常这将是一个列表或迭代器。
不要提供您自己的方式将输出转换为给定类型。Python 已经有一个非常简单的方法来做到这一点,任何使用你的函数的程序员都会熟悉它。查看标准 Python 库。这些例程有这样做吗?不,因为没有理由这样做。
例外:有时有一种方法可以获取迭代器或列表,即使将迭代器转换为列表很容易。通常,此功能作为两个单独的函数或方法提供。也许有时您可能想效仿,特别是如果您可以使用不同的算法实现这两种替代方案,从而为想要其中一种或另一种的调用者提供一些明显的好处。
| 归档时间: |
|
| 查看次数: |
14108 次 |
| 最近记录: |