Расширение аргументов кортежа при приведении к различным типам - PullRequest
2 голосов
/ 09 июля 2020

Я видел разные вопросы о кастинге при распаковке структур того же типа . Т.е.

def foo():
    return ('1', '2')

x, y = foo()  # as str
x, y = map(int, foo())  # as int
x, y = [int(n) for n in foo()]  # equivalently as int

Но предположим, что у вас есть

def foo():
    return ('s', '1')

, и вы хотите распаковать и преобразовать только второй элемент кортежа. Конечно, существует

x, y = foo()
y = int(y)

, который, во имя простоты, определенно мог бы быть наиболее подходящим подходом pythoni c. Из любопытства, есть ли еще более лаконичный способ sh выполнить одно и то же в одной строке?

Ответы [ 2 ]

2 голосов
/ 09 июля 2020

Если вы используете Python 3.8+, вы можете использовать выражение присваивания :=

def foo():
    return ('s', '1')

x, y = (v:=foo())[0], int(v[1])
print(x, y)

Выводит:

s 1
2 голосов
/ 09 июля 2020

Вы можете проверить, может ли значение быть преобразовано в int:

x, y = [int(n) if n.isdigit() for n in foo()]

Хотя это не сработает для отрицательных чисел, поэтому вы можете использовать предложение try / except

def convert(s, t=int):
    try:
        return t(s)
    except ValueError:
        return s

x, y = map(convert, foo())

В противном случае, если вы знаете, что каждое первое значение будет str, а второе будет int, вы можете использовать

x, y = foo(); y = int(y)

Если вы настаиваете на 1 лайнере

...