У меня есть простое приложение Python, и я пытаюсь объединить кучу выходных сообщений, чтобы стандартизировать вывод для пользователя. Я создал для этого файл свойств, и он выглядит примерно так:
[migration_prepare]
console=The migration prepare phase failed in {stage_name} with error {error}!
email=The migration prepare phase failed while in {stage_name}. Contact support!
slack=The **_prepare_** phase of the migration failed
Я создал метод для обработки получения сообщений из файла свойств... аналогично:
def get_msg(category, message_key, prop_file_location = "messages.properties"):
""" Get a string from a properties file that is utilized similar to a dictionary and be used in subsequent
messaging between console, slack and email communications"""
message = None
config = ConfigParser()
try:
dataset = config.read(prop_file_location)
if len(dataset) == 0:
raise ValueError("failed to find property file")
message = config.get(category, message_key).replace('\\n', '\n') # if contains newline characters i.e. \n
except NoOptionError as no:
print(
f"Bad option for value {message_key}")
print(f"{no}")
except NoSectionError as ns:
print(
f"There is no section in the properties file {prop_file_location} that contains category {category}!")
print(f"{ns}")
return f"{message}"
Метод возвращает строку F точно вызывающему классу. Мой вопрос в том, что в вызывающем классе, если строка в моем файле свойств содержит текст {some_value}, который предназначен для интерполяции компилятором в вызывающем классе с использованием F-строки с фигурными скобками, почему он возвращает строковый литерал? Вывод представляет собой буквальный текст, а не интерполированное значение, которое я ожидаю:
Что я получаю Не удалось выполнить этап подготовки к миграции на этапе {название_этапа}. Контактная поддержка!
Что бы я хотел На этапе подготовки к миграции произошел сбой на этапе согласования. Контактная поддержка!
Я хотел бы, чтобы результат метода возвращал интерполированное значение. Кто-нибудь делал что-нибудь подобное?
Я не уверен, где вы определяете свой stage_name
, но для интерполяции в файле конфигурации вам нужно использовать ${stage_name}
Интерполяция в f-строках и файлах configParser отличается.
Обновление: добавлено 2 примера использования:
# ${} option using ExtendedInterpolation
from configparser import ConfigParser, ExtendedInterpolation
parser = ConfigParser(interpolation=ExtendedInterpolation())
parser.read_string('[example]\n'
'x=1\n'
'y=${x}')
print(parser['example']['y']) # y = '1'
# another option - %()s
from configparser import ConfigParser, ExtendedInterpolation
parser = ConfigParser()
parser.read_string('[example]\n'
'x=1\n'
'y=%(x)s')
print(parser['example']['y']) # y = '1'
читать здесь. docs.python.org/3/library/…. я добавил примеры
Попытался добавить ${stage_name} в файл конфигурации. Это не сработало, у меня все еще есть ${stage_name}. Но я все равно ценю ваш вклад!