python: scope, closure

сегодня я узнал две вещи о питоне: одну плохую и одну хорошую, и обе про область видимости aka scope

хорошая новость — про клёвый reflection в питоне: с помощью функции locals() можно получить словарь локальных переменных. Я пока что не знаю, зачем это могло бы пригодиться (впрочем, есть такой вариант), но возможность радует!

(если что, замыкание/closure — это такая фича языка, когда при объявлении функции запоминается её область видимости, и потом при вызове её из любого места она может обращаться к тем переменным, которые были ей «видны при рождении»)

плохая новость: оказывается, в питоне замыкания работают так себе — если в коде внутренней функции встречается нечто похожее на объявление переменной, эта переменная считается локальной:

>>> def outer():
...     a = 4
...     def inner():
...         a += 1
...         print a
...     return inner
...
>>> outer()() 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 4, in inner
UnboundLocalError: local variable 'a' referenced before assignment

но если убрать строчку a += 1, то всё волшебным образом становится хорошо…

а вот как это работает в js:

js> function test(){ var a = 3; return function(){ print(++a); }; }
js> test()()
4

эх, вроде и симпатичный язык питон, но всё-таки яваскрипт лучше. Особенно в четвёртой редакции, о которой пока что можно только мечтать : )

Артемий Трегубенко,

comments powered by Disqus