Это фрагмент из учебника Google AppEngine.
application = webapp.WSGIApplication([('/', MainPage)], debug=True)
Я не совсем уверен, что debug=True
внутри вызова конструктора.
Создает ли она локальную переменную с именем debug
, присваивает ей True
и передает ее конструктору или это способ установить значение переменной члена экземпляра класса в конструкторе?
Функции Python принимают аргументы ключевых слов. Если вы определите такую функцию:
def my_func(a, b='abc', c='def'):
print a, b, c
Вы можете называть это следующим образом:
my_func('hello', c='world')
И результат будет:
hello abc world
Вы также можете поддерживать динамические аргументы ключевого слова, используя специальный синтаксис:
def my_other_func(a, *b, **c):
print a, b, c
*b
означает, что переменная b
будет принимать все неименованные аргументы после a
, как объект tuple
.**c
означает, что переменная c
примет все именованные аргументы как объект dict
.Если вы вызываете функцию следующим образом:
my_other_func('hello', 'world', 'what a', state='fine', what='day')
Вы получите:
hello ('world', 'what a') {'state': 'fine', 'what': 'day'}
Ничего - скорее, webapp.WSGIApplication
принимает необязательный аргумент с именем debug
, и этот код передает значение True
для этого параметра.
Ссылка на WSGIApplication
здесь, и на нем явно показан необязательный аргумент debug
и тот факт, что по умолчанию он равен False
если явно не передано.
Как ясно из страницы, передача debug
как True
означает, что полезная информация отладки отображается браузеру, если и когда возникает исключение при обработке запроса.
Как именно получается этот эффект (в частности, подразумевает ли он наличие атрибута на экземпляре WSGIApplication
или как может быть назван этот гипотетический атрибут) является внутренней, недокументированной деталью реализации, которую мы не обязательно беспокоиться (конечно, вы можете изучить источники WSGIApplication
в SDK, если вы беспокоитесь, или просто хотите узнать больше о одной возможной реализации этих спецификаций!).
Он использует именованные аргументы. См. Использование необязательных и именованных аргументов.