Есть ли что-то вроде «нелокальный» в Python <3? - PullRequest
3 голосов
/ 07 марта 2012

Я получил фрагмент кода, подобный следующему:

foo = None

def outer():
    global foo
    foo = 0

    def make_id():
        global foo
        foo += 1
        return foo


    id1 = make_id() # id = 1
    id2 = make_id() # id = 2
    id3 = make_id() # ...

Мне некрасиво определять foo в самой внешней области видимости, я бы предпочел иметь его только в функции outer.Как я правильно понимаю, в Python3 это делается nonlocal.Есть ли лучший способ для того, что я хочу иметь?Я бы предпочел объявить и присвоить foo в outer и, возможно, исключить его global в inner:

def outer():
    foo = 0

    def make_id():
        global foo
        foo += 1     # (A)
        return foo

    id1 = make_id() # id = 1
    id2 = make_id() # id = 2
    id3 = make_id() # ...

(A) не работает, foo, кажется, поискво внешней области.

Ответы [ 3 ]

6 голосов
/ 07 марта 2012

Для этой цели я использую списки из 1 элемента:

def outer():
    foo = [0]
    def make_id():
        r = foo[0]
        foo[0] += 1
        return r
    return make_id

make_id = outer()
id1 = make_id()
id2 = make_id()
...

Это то же самое, что и nonlocal, за счет немного более громоздкого синтаксиса (foo[0] вместо foo).

4 голосов
/ 07 марта 2012

Нет, укажите это в качестве функции make_id. Еще лучше поместить ваш идентификатор в класс, и иметь make_id в качестве метода экземпляра, и иметь этот экземпляр как глобальный (если необходимо).

0 голосов
/ 07 марта 2012

Нет, лучшая альтернатива для этого - атрибуты функций.

...