Python string format вызов функции
Существует ли способ форматирования с помощью нового синтаксиса формата строки из вызова функции? например:
"my request url was {0.get_full_path()}".format(request)
Поэтому он вызывает функцию get_full_path function внутри строки, а не в качестве параметра в функции формата.
Править:
Вот еще один пример, который, вероятно, лучше покажет мое разочарование, вот что мне хотелось бы:
"{0.full_name()} {0.full_last_name()} and my nick name is {0.full_nick_name()}".format(user)
Вот чего я хочу избежать:
"{0} and {1} and my nick name is {2}".format(user.full_name(), user.full_last_name(), user.full_nick_name())
4 ответов:
Python 3.6 добавляет литеральную строковую интерполяцию, которая записывается с префиксом
f. Смотрите PEP 0498 -- Литеральная строковая интерполяция .Это позволяет писать
Следует отметить, что они не являются реальными строками, А представляют собой код, который вычисляется в строку каждый раз. В приведенном выше примере>>> x = 'hello' >>> s = f'{x}' >>> print(s) hellosбудет иметь типstrсо значением'hello'. Вы не можете передатьf-строку, так как она будет вычислена до результатаstrПеред использованием (в отличие отstr.format, но как и любой другой модификатор строкового литерала, напримерr'hello',b'hello','''hello'''). (PEP 501 -- интерполяция строк общего назначения (в настоящее время отложена) предлагает строковый литерал, который будет вычисляться для объекта, который может принимать замены позже.)
Не уверен, что вы можете изменить объект,но вы можете изменить или обернуть объект, чтобы сделать свойства функций. Тогда они будут выглядеть как атрибуты, и вы можете сделать это как
class WrapperClass(originalRequest): @property def full_name(self): return super(WrapperClass, self).full_name() "{0.full_name} {0.full_last_name} and my nick name is {0.full_nick_name}".format(user)Что является законным.
Python напрямую не поддерживает интерполяцию переменных. Это означает, что ему не хватает определенной функциональности (а именно вызова функций в строках), которую поддерживают другие языки.
Итак, здесь действительно нечего сказать, кроме "нет", вы не можете этого сделать. Это просто не так, как работает синтаксис форматирования Python .Лучшее, что у вас есть, это:
"my request url was {0}".format(request.get_full_path())
А как насчет этой очень странной вещи?
"my request url was %s and my post was %s"\ % (lambda r: (r.get_full_path(), r.POST))(request)Пояснение:
Я все еще предпочитаю, как ты это делаешь.
- классический способ форматирования
- лямбда-функция, которая принимает запрос и возвращает кортеж с тем, что вы хотите
- называют лямбда-рядный в качестве аргументов строку.
Если вам нужна читабельность, вы можете сделать это:
path, post = request.get_full_path(), request.POST "my request url was {} and my post was {}".format(path, post)
Comments