Python - Neaten this append / extend条件

时间:2010-10-25 13:27:52

标签: python list append extend

我有一个方法可以接受单个对象或对象列表。我想添加传递给另一个列表的内容。目前,我的方法如下:

def appendOrExtend(self, item):
  if type(item).__name__ == "list":
    self.list.extend(item)
  else:
    self.list.append(item)

在我看来,应该有更多的Pythonic方法来实现这个目标,你能建议吗?

5 个答案:

答案 0 :(得分:10)

def append(self, item):
    self.list.append(item)
def extend(self, item):
    self.list.extend(item)

底线:没有办法做两件事。它会让您的方法变得有用,而不是更有用。它也更难测试和维护。此外,您的功能的用户已经知道她是否想要使用追加或扩展,因此通过提供单一方法,您将丢弃您的呼叫者/用户已经知道的信息。

另一种写法是使用打包/解包参数语法:

def append(self, *items):
    self.list.extend(items)

这样你可以将方法称为

x.append('single item')

x.append(*list_of_items)

答案 1 :(得分:3)

if isinstance(item, list):

答案 2 :(得分:1)

Zach提供了一种检查更优雅的类型的解决方案。但是,我将介绍两种不同的方法addOneElementaddMoreElements(或类似的东西)。这使得它 - 在我看来 - 更具可读性。

答案 3 :(得分:1)

如果您希望能够处理集合和元组,可以添加它们。要真正灵活,也许你应该采取任何可迭代的东西,但然后冒着你想要单独使用的字符串或其他对象的混淆,但碰巧是可迭代的。很快有人会告诉你这是一个坏主意,他们可能是对的 - 你的界面的这种灵活性使它变得模棱两可。

答案 4 :(得分:0)

您也可以在保持if测试的同时执行此操作:

if not isinstance(item, list):
    item = [item]
self.list.extend(item)