Ошибка типа при использовании функции в .format () - PullRequest
0 голосов
/ 29 октября 2018

Я прохожу Изучите Python упражнение «Трудный путь» 24 , преобразуя все форматирование старого стиля (%), которое они использовали в книге, в мой предпочитаемый новый стиль (.format ()).

Как видно из приведенного ниже кода, я могу успешно распаковать значения кортежей, возвращаемые функцией, если назначу переменную "p". Но когда я использую это возвращаемое значение напрямую, он выдает TypeError.

def secret_formula(started):
    jelly_beans = started * 500
    jars = jelly_beans / 1000
    crates = jars / 100
    return jelly_beans, jars, crates

start_point = 10000

#Old style
print("We'd have %d beans, %d jars, and %d crates." % secret_formula(start_point))

#New style that works
print("We'd have {p[0]:.0f} beans, {p[1]:.0f} jars, and {p[2]:.0f} crates.".format(p=secret_formula(start_point)))

#This doesn't work:
print("We'd have {0:.0f} beans, {1:.0f} jars, and {2:.0f} crates.".format(secret_formula(start_point)))

Выдает ошибку:

Traceback (most recent call last):
      File "ex.py", line 16, in <module>
        print("We'd have {0:.0f} beans, {1:.0f} jars, and {2:.0f} crates.".format(secret_formula(start_point)))
    TypeError: unsupported format string passed to tuple.__format__
  1. Может кто-нибудь объяснить, почему использование функции в .format () напрямую не работа?
  2. Как преобразовать его в f-строку?

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Передача возвращаемого значения secret_formula в format позиционно не более прямолинейна, чем передача по ключевому слову. В любом случае, вы передаете возвращаемое значение как один аргумент.

Чтобы получить доступ к элементам этого аргумента, когда вы передаете его как аргумент ключевого слова p, вы используете p[0], p[1] и p[2]. Аналогично, при передаче аргумента позиционно, вам необходимо получить доступ к элементам как 0[0], 0[1] и 0[2], указав позицию 0. (Именно так str.format обрабатывает заполнители формата, а не обычный синтаксис индексации Python):

print("We'd have {0[0]:.0f} beans, {0[1]:.0f} jars, and {0[2]:.0f} crates.".format(
      secret_formula(start_point)))

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

print("We'd have {0:.0f} beans, {1:.0f} jars, and {2:.0f} crates.".format(
      *secret_formula(start_point)))
0 голосов
/ 29 октября 2018

это потому, что вы передаете кортеж из 3 значений в качестве вывода вашей функции

Чтобы это работало, вам нужно распаковать кортеж с *

print("We'd have {0:.0f} beans, {1:.0f} jars, and {2:.0f} crates.".format(*secret_formula(start_point)))

Вы также можете сделать это с объектом, где ключи должны соответствовать именам параметров функции, например:

def func(param, variable):
  return None

args = {'param': 1, 'variable': 'string'}
func(*args)
...