我有一个返回列表或元组的方法。在参数中表示返回类型的最pythonic方式是什么?
def names(self, section, as_type=()):
return type(as_type)(([m[0] for m in self.items(section)]))
答案 0 :(得分:27)
pythonic方式根本不关心类型。返回一个元组,如果调用函数需要一个列表,那么让它在结果上调用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))
答案 1 :(得分:6)
保持简单:
def names(self, section):
"""Returns a list of names."""
return [m[0] for m in self.items(section)]
如果调用者想要一个元组而不是列表,他会这样做:
names = tuple(obj.names(section))
答案 2 :(得分:3)
在大多数情况下返回调用者想要的任何内容。如果他们希望能够排序,删除或删除项目等,则使用列表。如果他们想将它用作字典键,请使用元组。如果主要用途是迭代,则返回迭代器。如果它对调用者来说无关紧要,那么它不会比你想象的更频繁,那么返回任何使代码最直接的东西。通常这将是一个列表或迭代器。
不要提供自己的方式将输出转换为给定类型。 Python有一个非常简单的方法可以做到这一点,任何使用你的函数的程序员都会熟悉它。看看标准的Python库。这些例程中的任何一个都这样做吗?不,因为没有理由。
异常:有时候有一种获取迭代器或列表的方法,即使将迭代器转换为列表也很容易。通常,此功能作为两个单独的功能或方法提供。 也许你有时可能想要效仿,特别是如果你能够使用不同的算法实现这两种选择,这些算法可以为想要一个或另一个的呼叫者提供一些明显的好处。