Цитата из Python 3 Reference :
Нелокальный оператор заставляет перечисленные идентификаторы ссылаться на ранее связанные переменные в ближайшей охватывающей области, исключая глобальные переменные.
Как сказано в ссылке, в случае нескольких вложенных функций изменяется только переменная в ближайшей закрывающей функции:
def outer(): def inner(): def innermost(): nonlocal x x = 3 x = 2 innermost() if x == 3: print('Inner x has been modified') x = 1 inner() if x == 3: print('Outer x has been modified') x = 0 outer() if x == 3: print('Global x has been modified') # Inner x has been modified
«Ближайшая» переменная может быть нескольких уровней away:
def outer(): def inner(): def innermost(): nonlocal x x = 3 innermost() x = 1 inner() if x == 3: print('Outer x has been modified') x = 0 outer() if x == 3: print('Global x has been modified') # Outer x has been modified
Но это не может быть глобальной переменной:
def outer(): def inner(): def innermost(): nonlocal x x = 3 innermost() inner() x = 0 outer() if x == 3: print('Global x has been modified') # SyntaxError: no binding for nonlocal 'x' found
Вам не нужен Windsor для использования DynamicProxy. Windsor использует DynamicProxy для своих целей, так же как NHibernate, RhinoMocks, Moq или другие библиотеки/приложения/фреймворки. Если вам нужен только runtime AOP, без IoC контейнера, используйте только Caste DynamicProxy.
Он активно развивается, последний предварительный релиз был выпущен 2 недели назад, финальный релиз (v2.5) ожидается в этом месяце.
Примечание: В предыдущих версиях (до v2.2) DynamicProxy находился в собственной сборке Castle.DynamicProxy.dll. Позже он был перенесен в Castle.Core.dll, и теперь для его использования не требуется никакой другой сборки. Источник
Был также Aurum (доступен на www.machinaaurum.com.br), который был построен на Unity. Исходники доступны на Codeplex.