我有一个方法可以接受单个对象或对象列表。我想添加传递给另一个列表的内容。目前,我的方法如下:
def appendOrExtend(self, item):
if type(item).__name__ == "list":
self.list.extend(item)
else:
self.list.append(item)
在我看来,应该有更多的Pythonic方法来实现这个目标,你能建议吗?
答案 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提供了一种检查更优雅的类型的解决方案。但是,我将介绍两种不同的方法addOneElement
和addMoreElements
(或类似的东西)。这使得它 - 在我看来 - 更具可读性。
答案 3 :(得分:1)
如果您希望能够处理集合和元组,可以添加它们。要真正灵活,也许你应该采取任何可迭代的东西,但然后冒着你想要单独使用的字符串或其他对象的混淆,但碰巧是可迭代的。很快有人会告诉你这是一个坏主意,他们可能是对的 - 你的界面的这种灵活性使它变得模棱两可。
答案 4 :(得分:0)
您也可以在保持if测试的同时执行此操作:
if not isinstance(item, list):
item = [item]
self.list.extend(item)