Python: вернуть кортеж или список?
У меня есть метод, который возвращает либо список, либо кортеж. Какой самый питонный способ обозначить тип возвращаемого значения в аргументе?
def names(self, section, as_type=()):
return type(as_type)(([m[0] for m in self.items(section)]))
3 ответа
Питоническим способом было бы вообще не заботиться о типе. Вернуть кортеж, и если вызывающей функции нужен список, пусть она вызывает list()
на результат. Или наоборот, в зависимости от типа по умолчанию.
Еще лучше, пусть он возвращает выражение генератора:
def names(self, section):
return (m[0] for m in self.items(section))
Теперь вызывающая сторона получает итеративный код, который оценивается лениво. Затем он может решить перебрать его:
for name in obj.names(section):
...
или создать список или кортеж из него с нуля - ему никогда не придется преобразовывать существующий список в кортеж или наоборот, так что это эффективно во всех случаях:
mylist = list(obj.names(section))
mytuple = tuple(obj.names(section))
Будь проще:
def names(self, section):
"""Returns a list of names."""
return [m[0] for m in self.items(section)]
Если вызывающий объект хочет получить кортеж вместо списка, он делает это:
names = tuple(obj.names(section))
Верните все, что захочет звонящий большую часть времени. Если они захотят сортировать, удалять или удалять элементы и т. Д., Используйте список. Если они захотят использовать его в качестве словарного ключа, используйте кортеж. Если основное использование будет итерацией, верните итератор. Если для вызывающей стороны это не имеет значения, а это не так часто, как вы думаете, верните то, что делает код максимально простым. Обычно это будет список или итератор.
Не предоставляйте свой собственный способ преобразования вывода в данный тип. У Python есть совершенно простой способ сделать это уже, и любой программист, использующий вашу функцию, будет знаком с этим. Посмотрите на стандартную библиотеку Python. Есть ли какие-либо из этих процедур сделать это? Нет, потому что нет причин для этого.
Исключение: иногда есть способ получить итератор или список, даже если его легко преобразовать в список. Обычно эта возможность предоставляется в виде двух отдельных функций или методов. Может быть, вы иногда захотите последовать их примеру, особенно если бы вы могли реализовать две альтернативы, используя разные алгоритмы, которые дают определенную выгоду вызывающим абонентам, которые хотят того или другого.