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