Как изменить переменную вложенной функции во вложенной функции

Это сделало бы это - предполагая среду, подобную Unix.

MKDIR_P = mkdir -p

.PHONY: directories

all: directories program

directories: ${OUT_DIR}

${OUT_DIR}:
        ${MKDIR_P} ${OUT_DIR}

Это должно быть запущено в каталоге верхнего уровня - или определение $ {OUT_DIR} должно быть правильно относительно того, где он запускается. Конечно, если вы будете следовать указателям статьи « Recursive Make Considered Harmful » Питера Миллера, вы все равно будете запускать make в каталоге верхнего уровня.

I ' m играл с этим (RMCH) на данный момент. Это потребовало некоторой адаптации к набору программного обеспечения, которое я использую в качестве площадки для тестирования. В пакете есть дюжина отдельных программ, построенных с распространением источника по 15 каталогам, часть из которых разделена. Но с небольшой осторожностью это можно сделать. OTOH, это может быть неприемлемо для новичков.


Как отмечено в комментариях, перечисление команды «mkdir» как действие для «каталогов» неверно. Как также отмечено в комментариях, есть другие способы исправить ошибку «не знаю, как сделать вывод / отладочную ошибку». Один из них - удалить зависимость от линии «каталогов». Это работает, потому что «mkdir -p» не генерирует ошибок, если все каталоги, которые его просят создать, уже существуют. Другой показан механизм, который будет пытаться создать каталог, если он не существует. Версия «с поправками» - это то, что я имел в виду прошлой ночью, - но обе эти методы работают (и у обоих есть проблемы, если существует выход / debug, но это файл, а не каталог).

16
задан bxx 1 June 2011 в 09:05
поделиться

2 ответа

В Python 3.x вы можете использовать декларацию nonlocalnested), чтобы сообщить Python, что вы хотите присвоить переменной count в nesting.

В Python 2.x вы просто не можете назначить count в nesting из nested. Тем не менее, вы можете обойти это, не присваивая переменной переменную, а используя изменяемый контейнер:

def nesting():
    count = [0]
    def nested():
        count[0] += 1

    for i in range(10):
        nested()
    print count[0]

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

21
ответ дан Thomas Wouters 1 June 2011 в 09:05
поделиться

Самый элегантный подход для меня: 100% работает на обеих версиях Python.

def ex8():
    ex8.var = 'foo'
    def inner():
        ex8.var = 'bar'
        print 'inside inner, ex8.var is ', ex8.var
    inner()
    print 'inside outer function, ex8.var is ', ex8.var
ex8()

inside inner, ex8.var is  bar
inside outer function, ex8.var is  bar

Подробнее: http://www.saltycrane.com/blog/2008/01/python-variable-scope-notes/

0
ответ дан Deivydas Voroneckis 1 June 2011 в 09:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: