2010-08-25 3 views
1

Я пишу функцию питона со следующим:Лучший способ сделать это?

class myObj(object): 
    def __init__(self, args): 
     # there is code here 
    def newO(self, name, description): 
     if type(name)==str: 
      self.oname.append(name) 
      self.o.append(description) 
     elif type(name)==list: 
      for n in name: 
       self.oname.append(n) 
       self.o.append(description) 

Однако я привел считаю, что это не самый лучший способ для достижения этой цели. Что лучше? Я хочу иметь возможность называть newO строкой или списком.

+0

Будет self.o и self.oname типов? – shahjapan

ответ

4
  1. Никогда не проверяйте type(x) == foo, используйте isinstance(x, foo) - бывший сломается, если существует подкласс, например.

  2. Кажется, что вы поддерживаете параллельные списки. Если порядок имеет значение, вместо этого может возникнуть смысл использовать список кортежей, поэтому self.values.append((name, description)). Если порядок не имеет значения, словарь будет лучше: self.values[name] = description (при условии, что вы не хотите дублировать имена).

  3. Однобуквенные переменные - нет-нет.

  4. Если вы хотите позвонить newO со строкой или списком, каков был бы недостаток его разделения на две функции? Возможно (и я могу ошибаться), вы исходите из языка с полиморфизмом времени компиляции, где строка и список будут отправляться по-разному. На самом деле они рассматриваются как разные функции, поэтому в динамическом языке вы можете разделить их, как это:

    def add(self, name, description): 
        ... 
    def add_many(self, name_list, description): 
        for name in name_list: 
         self.add(name, description) 
    

    Вполне возможно, что вы не знаете, априори ли у вас строку или список, но я надеюсь, что это не так.

  5. Действительно ли случай одной строки действительно отличается от случая списка строк? Почему бы просто не использовать одноэлементный список, чтобы удалить условный? Вы можете использовать переменные аргументы, а также, чтобы сделать синтаксис более пуленепробиваемым:

    def add_names(self, description, *name_list): 
        for name in name_list: 
         self.add(name, description) 
    
+0

Спасибо. Я попытаюсь использовать словарь, чтобы исправить параллельный список (что мне не понравилось). Вероятно, в конечном итоге я буду использовать списки отдельных элементов вместо строк. Я действительно изучаю python как свой первый полный язык. – Violet