Каков порядок поиска свободных переменных в Python? - PullRequest
0 голосов
/ 31 июля 2010

В частности, как свободные переменные связаны при определении для методов класса? Это, вероятно, что-то вроде этого:

  1. функция включения (временная) область действия => создать замыкание
  2. глобальная (постоянная) область действия => не генерировать закрытие (просто посмотрите, когда выполняется тело метода)
  3. повышение UnboundLocalError ()

Вот два примера:

globalname = 0
class Test(object):
    def method(self):
        print globalname
        print Test

def outer():
    localname = 1
    class Test(object):
        def method(self):
            print globalname
            print localname
            print Test
    return Test

Test().method.__func__.__closure__
# None
outer()().method.__func__.__closure__
# (<cell at 0xb7d655b4: type object at 0x82412bc>, <cell at 0xb7d655cc: int object at 0x81b20b0>)

Я не смог найти много документации о том, как именно они обрабатываются во время определения. Является ли приведенное выше объяснение правильным?

1 Ответ

2 голосов
/ 31 июля 2010

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

spam = 0
def ham:
    print( spam )

сделает спам глобальной переменной, но

spam = 0
def ham:
    spam = 0
    print( spam )

создаст отдельную переменную, локальную для ham. Закрытие захватывает все переменные, локальные для охватывающей области видимости. В вашем первом примере нет локальных переменных, поэтому нет замыкания; во втором localname назначается и, следовательно, method является замыканием.

Как всегда в Python, есть способы обойти это предположение. Ключевое слово global объявляет переменную как глобальную (!), Например,

spam = 0
def ham:
    global spam
    spam = 0
    print( spam )

будет , а не будет закрытием. Py3k вводит ключевое слово nonlocal, которое говорит Python смотреть вверх через области видимости, пока не найдет имя переменной и не обратится к ней.

...