Лучший способ сделать это?

1

Я пишу функцию python со следующим:

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?
Теги:

1 ответ

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

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

  • Однобуквенные переменные не имеют значения.

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

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

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

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

    def add_names(self, description, *name_list):
        for name in name_list:
            self.add(name, description)
    
  • 0
    Благодарю. Я попробую сделать словарь, чтобы исправить параллельный список (который мне не понравился). Я, вероятно, в конечном итоге использовать списки отдельных элементов вместо строк. На самом деле я изучаю Python как мой первый полный язык.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню