#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
только часть, и вам не нужно полное совпадение того, что находится внутри фигурных скобок.