Распаковать возвращаемое значение из кортежа длины 1 - PullRequest
0 голосов
/ 05 июня 2018

Допустим, у меня есть фиктивная функция, которая возвращает именно то, что дают в качестве параметра:

def dummy_single(arg1):
    """Repeat the same argument."""
    return arg1

Я могу использовать эту функцию следующим образом:

same_obj1 = dummy_single(obj1)

Теперь, еслиЯ хочу, чтобы эта функция принимала несколько аргументов и возвращала одно и то же, я могу упаковать и распаковать аргументы:

def dummy_multiple(*args):
    """Repeat all given arguments."""
    return args

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

Она работает очень хорошо, когда вызывается с несколькими аргументами:

same_obj1, same_obj2 = dummy_multiple(obj1, obj2)

Однако это не будет работать должным образом:

same_tuple = dummy_multiple(obj1)

same_obj1 содержит (упакованный) кортеж, в отличие от объекта в двух предыдущих примерах.Я думал об исправлении этого поведения следующим образом, но он не выглядит чистым, поскольку возвращаемый тип отличается в зависимости от аргументов.

def dummy_multiple_fixed(*args):
    """Repeat all given arguments."""
    if len(args) == 1:
        return args[0]
    return args

Это не критическая проблема, и ее легко устранить.Но я не могу найти чистый и элегантный способ решить эту проблему.

1 Ответ

0 голосов
/ 05 июня 2018

Вы не должны делать особый случай из кортежа длины 1.Функция должна иметь один четко определенный тип возвращаемого значения.

Хотя знайте, что вы можете распаковать кортеж длины 1:

def dummy_multiple(*args):
    """Repeat all given arguments."""
    return args

same_obj1, = dummy_multiple(1)
#        ^ notice the comma here

print(same_obj1) # 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...