Python:返回元组还是列表?
我有一个方法,它会返回一个列表或者一个元组。那么在参数中,最符合Python风格的方式来表示返回类型是什么呢?
def names(self, section, as_type=()):
return type(as_type)(([m[0] for m in self.items(section)]))
3 个回答
5
保持简单:
def names(self, section):
"""Returns a list of names."""
return [m[0] for m in self.items(section)]
如果调用者想要一个元组而不是列表,他可以这样做:
names = tuple(obj.names(section))
6
返回调用者大多数时候想要的东西。如果他们需要排序、删除或移除项目等功能,那就用列表。如果他们想把它当作字典的键,那就用元组。如果主要用途是遍历,那就返回一个迭代器。如果调用者对返回什么不太在意,这种情况比你想象的要多,那就返回最简单明了的东西。通常来说,这会是一个列表或一个迭代器。
不要自己提供将输出转换为特定类型的方法。Python已经有很简单的方法来做到这一点,任何使用你函数的程序员都会熟悉这些。看看标准的Python库,里面有没有这样的功能?没有,因为没有必要。
例外情况:有时候可以得到一个迭代器或列表,尽管将迭代器转换为列表很简单。通常这种功能会作为两个独立的函数或方法提供。也许你有时可以效仿这种做法,特别是如果你能用不同的算法实现这两种选择,从而给想要其中一种的调用者带来明显的好处。
33
用Python的方式来说,其实不需要太在意返回的是什么类型。你可以返回一个元组,如果调用这个函数的地方需要一个列表,那就让它对结果使用 list()
来转换一下。反之亦然,选择一个更合适的默认类型就好。
更好的做法是返回一个生成器表达式:
def names(self, section):
return (m[0] for m in self.items(section))
这样调用者就能得到一个可以逐步计算的可迭代对象。他可以选择逐个遍历这个对象:
for name in obj.names(section):
...
或者从头开始创建一个列表或元组,这样他就不需要把现有的列表转换成元组,或者把元组转换成列表,这样在任何情况下都是高效的:
mylist = list(obj.names(section))
mytuple = tuple(obj.names(section))