1

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

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

在我看来,应该有一种更 Pythonic 的方式来实现这一点,你能推荐一个吗?

4

5 回答 5

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)
于 2010-10-25T13:38:23.007 回答
3
if isinstance(item, list):
于 2010-10-25T13:31:00.070 回答
1

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

于 2010-10-25T13:35:16.067 回答
1

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

于 2010-10-25T13:36:01.907 回答
0

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

if not isinstance(item, list):
    item = [item]
self.list.extend(item)
于 2010-10-25T13:49:11.833 回答