Получение функции Python для чистого возврата скаляра или списка, в зависимости от количества аргументов

Отказ от ответственности: я ищу решение Python 2.6, если оно есть.

Я ищу функцию, которая возвращает одно значение при передаче одного значения или возвращает последовательность при передаче нескольких значений:

>>> a = foo(1) 2 >>> b, c = foo(2, 5) >>> b 3 >>> c 6 

Чтобы быть ясным, это делается для того, чтобы некоторые вызовы функций выглядели лучше, чем:

 a, = foo(1) 

или

 a = foo(1)[0] 

Прямо сейчас, неэлегантное решение – это что-то вроде этого:

 def foo(*args): results = [a + 1 for a in args] return results if len(results) > 1 else results[0] 

Есть ли какой-нибудь синтаксический сахар (или функции), который сделает это чище? что-нибудь вроде следующего?

 def foo(*args): return *[a + 1 for a in args] 

5 Solutions collect form web for “Получение функции Python для чистого возврата скаляра или списка, в зависимости от количества аргументов”

Вы можете легко написать функцию scalify которая возвращает элемент из списка, если в списке есть только один элемент, т. scalify Он пытается сделать его скаляром (отсюда и название).

 def scalify(l): return l if len(l) > 1 else l[0] 

Затем вы можете использовать его в своих функциях так:

 def foo(*args): return scalify([a + 1 for a in args]) 

Это сделает трюк, но я с теми, кто предлагает, чтобы вы этого не делали. По одной причине он исключает повторение результата, если вы не знаете, что вы прошли по крайней мере в двух пунктах. Кроме того, если у вас есть список, вам нужно распаковать список при вызове функции, потеряв «список», и вы знаете, что вы не можете вернуть список. Эти недостатки, по-моему, затмевают любую пользу, которую вы можете увидеть в технике.

Вы всегда можете написать декоратор, чтобы убедиться, что если оператор if, если это вам лучше:

 import functools def unpacked(method): @functools.wraps(method) def _decorator(*args): result = method(*args) return results if len(results) != 1 else results[0] return _decorator 

Применение:

 @unpacked def foo(*args): return [arg + 1 for arg in args] 

Вы имеете в виду, что хотите кортеж с таким же количеством аргументов? Разве это не решение?

return tuple([a + 1 for a in args])

 def foo(*args): return (None, args[0]+1 if args else None, map(lambda a: a + 1, args))[len(args) if len(args) < 3 else 2] 

🙂 это ад

Это будет обрабатывать 0 или более аргументов, я думаю, это то, что вы ищете.

 def foo(*args): return map(lambda x: x + 1, args) or [None] 

редактирование: я переработал, чтобы добавить список «Нет», чтобы распаковать 0 аргументов

  • Список Python () против скорости построения списка
  • Python: конвертировать кортеж в разделенную запятыми строку
  • Как заставить PyYAML загружать строки как объекты Unicode?
  • Как работает функция min / max в вложенном списке?
  • print .__ doc__ vs getattr (__ builtin __, "print") .__ doc__
  • Вход в Python с файлом Config - использование обработчиков, определенных в файле через код
  • Функция raw_input в Python
  • Конец поддержки для python 2.7?
  • Общая поддержка Unicode / UTF-8 для файлов csv в Python 2.6
  • Число меньше отрицательной бесконечности в python?
  • Как я могу обозначить неиспользуемые аргументы функции?
  •  
    Interesting Posts for Van-Lav

    Каков рабочий каталог при использовании IDLE?

    Как вы используете subprocess.check_output () в Python?

    как заменить символ ВНУТРИ текстового содержимого многих файлов автоматически?

    Могу ли я генерировать и показывать другое изображение во время каждого цикла с помощью Matplotlib?

    Matplotlib – Как установить ylim () для серии графиков?

    Как рассортировать scapy-пакет?

    как фильтровать повторяющиеся запросы на основе url в scrapy

    Учитывая большой список URL-адресов, какой способ проверить, какие из них активны / неактивны?

    Сколько времени используется сборщик мусора?

    Matplotlib, добавив текст с несколькими строками. Добавление текста, который может следовать кривой

    Многократное назначение Python3 и адрес памяти

    NamedTuples в макросах шаблонов Jinja2

    Блоки python org-mode Emacs содержат 5 пробелов, но мне нужны 4 пробела

    Предоставление C ++ API для Python

    скрытая строка, которая является списком в правильный список python

    Python - лучший язык программирования в мире.