Замена части строки с помощью .format() в python

#python #python-3.x #string-formatting

Вопрос:

Я работал над книгой о некоторых передовых концепциях python и наткнулся на следующий блок кода:

 SECRET = 'this-is-a-secret'


class Error:
    def __init__(self):
        pass

err = Error()
print(err.__init__.__globals__["SECRET"])
user_input = '{error.__init__.__globals__[SECRET]}'
# Results in accessing the globals dictionary of the object and then the value of secret
print(user_input.format(error=err))
 

Согласно коду, мы можем получить доступ к СЕКРЕТНОЙ переменной, использование .format() которой делает их немного уязвимыми. Как мы можем получить доступ только к error части внутри блока {} и заменить ее нашим err объектом.

Я вижу, что error часть заменена объектом, который мы только что создали выше. Разве нам не требуется полная замена того, что находится внутри блока {} строки? Как происходит этот процесс с .format() работой.

Комментарии:

1. Я не вижу смысла в ваших упражнениях. Любой желающий может напрямую просмотреть значение глобальной переменной.

Ответ №1:

Если вы посмотрите на синтаксис строкового формата (https://docs.python.org/3/library/string.html#format-string-syntax), error.__init__.__globals__[SECRET] часть пользовательского ввода field_name соответствует и error соответствует arg_name , а остальная часть-или attribute_name или element_index .

Таким образом, содержимое {} вашего пользовательского ввода является допустимым синтаксисом для str.format . Когда вы даете аргумент .format, он заменяет arg_name только часть, и вам не нужно полное совпадение того, что находится внутри фигурных скобок.