Проверьте, было ли предоставлено значение из строки формата - PullRequest
0 голосов
/ 24 апреля 2020

Таким образом, в основном у меня есть строка формата fmt, для которой метод format будет вызван в другом модуле, который я не могу контролировать.

В этой строке формата я хочу дополнительно включить поле если он был предоставлен в качестве аргумента для метода форматирования, в противном случае я хочу пропустить его.

Что-то вроде:

fmt = 'Optional value: {value if wasPassed("value") else ""}'
fmt.format(value = "foo") #Should return 'Optional value: foo'
fmt.format() #Should return 'Optional value: ' and not throw a Key error

Поскольку у меня нет доступа к вызову "format", я хочу решить это как-то внутри строки. Для контекста я использую это как строку формата, передаваемую в модуль журналирования, но мне бы очень хотелось общее решение вышеуказанной проблемы.

В конкретном случае использования c я мог бы передать пользовательский форматер в logger, но этот вопрос действительно нацелен на решение проблемы в выражении в строке для форматирования. (Если это просто невозможно, я также был бы признателен за ответ, указывающий на причину, так что я могу перестать лаять неправильное дерево и просто использовать пользовательский форматер)

1 Ответ

0 голосов
/ 24 апреля 2020

Предполагая, что у вас есть контроль над тем, когда модуль использует аргумент, вы можете написать «упаковывающую» функцию, например,

def myformat(fmt, arg=""):
    module.method(fmt, arg)

В качестве альтернативы здесь может использоваться что-то вроде рекурсивного метода (основанного на перехвате и обработке KeyError). будь все, что возможно (на основе документов ), так как у тебя нет доступа к внутренним компонентам метода: { ссылка }

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

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

...