Синтаксис функции Python кажется неправильным, но работает - PullRequest
3 голосов
/ 26 октября 2011

Все, сегодня я столкнулся со странным сюрпризом в python. Следующий код работает, но, кажется, нарушает синтаксис Python. Я не знаю, почему это будет работать без оператора pass или некоторого кода, но это так.

def test():
    '''Sample docstring.'''

for i in range(10):
    test()
    print "testing", i

Я бы хотел определить, почему это работает, и оставляет ли оно какие-либо неприятные биты в памяти во время работы. Это может быть причиной проблемы с памятью, которую я пытался отследить.

Ответы [ 3 ]

11 голосов
/ 26 октября 2011

В блоке должен быть хотя бы один оператор. Одиночный строковый литерал считается допустимым оператором, даже если он используется в качестве строки документации. Это не должно вызывать каких-либо утечек памяти, поскольку компилятор пропускает его в реальном коде.

2 голосов
/ 26 октября 2011

Синтаксис Python объясняется в справочнике по языку.Соответствующие части:

7.7 Определения функций

...
funcdef        ::=  "def" funcname "(" [parameter_list] ")" ":" suite
...

Итак, синтаксис для функции - это все, что нужно до двоеточия, за которым следует suite.

7.Составные операторы

...
suite         ::=  stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
...
stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]
...

Таким образом, suite может быть либо stmt_list, либо блоком с отступом, содержащим хотя бы один statement ... А stmt_list - это просто наборsimple_stmt чанки, соединенные точкой с запятой в одной строке.

Наконец:

6.Простые утверждения

simple_stmt ::=  expression_stmt
             | assert_stmt
             ...

Это показывает, что simple_statement может быть любым выражением, или assert, или любым другим, что было в списке.

Вы можете нажимать ссылкина этих страницах, чтобы исследовать дальше.expression_stmt - это просто любое выражение, вычисляемое само по себе, например:

dir
2
"cat"
int()

. Это совершенно правильная программа на Python, которая будет анализировать и запускать, даже если она ничего не делает.

ФункцияСтрока документа также является выражением.Это просто строка, которая обрабатывается системой специально.

Однако специальная обработка не является частью синтаксиса.Это происходит на другом этапе, долгое время после того, как синтаксический анализатор построил свое абстрактное синтаксическое дерево.

Я бы искал в другом месте проблему с памятью ...:)

0 голосов
/ 26 октября 2011

Строка документа также является утверждением. (Точнее выражение выражения.)

Он получает специальную обработку от компилятора, но синтаксически это совершенно верное утверждение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...