Python - убрать это условное добавление / расширение - PullRequest
1 голос
/ 25 октября 2010

У меня есть метод, который я буду принимать либо один объект или список объектов. Я хочу добавить все, что передается в другой список. В настоящее время мой метод выглядит так:

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

Мне кажется, что должен быть более Pythonic способ достижения этого, не могли бы вы предложить один?

Ответы [ 5 ]

10 голосов
/ 25 октября 2010
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)
3 голосов
/ 25 октября 2010
if isinstance(item, list):
1 голос
/ 25 октября 2010

Если вы хотите иметь возможность обрабатывать наборы и кортежи, вы можете добавить их.Чтобы быть по-настоящему гибким, может быть, вы должны взять что-нибудь итеративное, но тогда рискуйте путаницей со строками или другими объектами, которые вы хотите взять индивидуально, но которые оказываются итеративными.Вскоре кто-то скажет вам, что это плохая идея, и они, вероятно, будут правы - такая большая гибкость в вашем интерфейсе делает его неоднозначным.

1 голос
/ 25 октября 2010

Зак предоставляет решение для проверки типа более элегантно.Однако я бы ввел два отдельных метода addOneElement и addMoreElements (или что-то подобное).Это делает это - на мой взгляд - гораздо более читабельным.

0 голосов
/ 25 октября 2010

Вы также можете сделать это, сохраняя тест if:

if not isinstance(item, list):
    item = [item]
self.list.extend(item)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...