ещё питоновых грабелек
Jul. 4th, 2012 02:16 pmКто с ходу увидит ошибку?
for i in range(0,3):
test.acct_servers[i].handleAcctRequest = \
lambda p: handleAcctRequest(test, test.acct_servers[i], p)
Получившие данную шишку на лбу понимают, почему для порождения замыкания надо рисовать отдельную функцию.
UPD[2012-07-05]: от gegmopo4:
... lambda p, i=i: (далее по тексту)
Работает, но я не берусь отправлять такое в общее репо.
no subject
Date: 2012-07-04 11:26 am (UTC)no subject
Date: 2012-07-04 12:01 pm (UTC)no subject
Date: 2012-07-04 12:03 pm (UTC)В первом случае всё должно работать правильно, во втором вообще не понятно что будет с i после ухода из скоупа цикла. Ну, то есть, язык с GC, ясно что будет — у всех оно получится 3.
no subject
Date: 2012-07-04 12:58 pm (UTC)no subject
Date: 2012-07-04 01:00 pm (UTC)no subject
Date: 2012-07-04 01:04 pm (UTC)no subject
Date: 2012-07-04 01:05 pm (UTC)no subject
Date: 2012-07-04 01:29 pm (UTC)no subject
Date: 2012-07-04 01:31 pm (UTC)Когда пишут фор в си-подобных языках, тоже пишут (i = 0; i < 10; i++), а не i <= 9. Всë ок, так удобно жить.
no subject
Date: 2012-07-04 01:32 pm (UTC)Не знаю, почему.
no subject
Date: 2012-07-04 01:34 pm (UTC)no subject
Date: 2012-07-04 01:50 pm (UTC)no subject
Date: 2012-07-04 01:52 pm (UTC)no subject
Date: 2012-07-04 02:06 pm (UTC)no subject
Date: 2012-07-04 02:23 pm (UTC)Если мы начинаем с 0, то индекс меньше длины. А если с 1, то меньше или равен - и начинают вылезать ошибки на 1 в разных местах. :(
Я когда-то видел статью, написанную внятнее, чем у Дейкстры, но в целом сначала думаешь "а что, прикольно", а потом все эти ошибки на 1 когда вылезут - становится совсем невесело.
Это надо сказать, что в Луа с ними проще, чем там в жс или в си - есть итераторы типа pairs/ipairs, которые вернут что надо, иначе бы циклы довольно стрëмно выглядели.
no subject
Date: 2012-07-05 08:27 am (UTC)no subject
Date: 2012-07-04 07:28 pm (UTC)[a,a) ==> empty
[a,b) [b,c) ==> [a,c)
[a,b) [c, d) ==> [b, c)
(следствие) [a,b) [b,c) ==> empty
(следствие) a <= b <= c ==> [a,c) = [a, b) [b, c), при этом <= в левой части существенно.
С открытыми и закрытыми появляются граничные случаи в количествах.
no subject
Date: 2012-07-04 07:30 pm (UTC)[a,b) union [b,c) => [a,c)
[a,b) intersect [c,d) => [b,c)
[a,b) intersect [b,c) => empty
a <= b <= c ==> [a, c) = [a,b) union [b,c)
no subject
Date: 2012-07-04 01:13 pm (UTC)let lambas = [];
for (let i = 0; i < 10; i++) {
lambdas.push(function() { console.log(i); });
}
Это будет работать как хочется.
no subject
Date: 2012-07-04 12:28 pm (UTC)no subject
Date: 2012-07-04 12:29 pm (UTC)no subject
Date: 2012-07-04 12:42 pm (UTC)В кложуре всë immutable, там просто иначе никак не выйдет, так что там нормально. Итого - хаскель, окамл, кложура. Хз, что там в ерланге.
no subject
Date: 2012-07-04 06:03 pm (UTC)no subject
Date: 2012-07-04 11:50 am (UTC)no subject
Date: 2012-07-04 12:01 pm (UTC)no subject
Date: 2012-07-04 12:27 pm (UTC)no subject
Date: 2012-07-04 01:02 pm (UTC)no subject
Date: 2012-07-04 12:53 pm (UTC)lambda p, i=i:no subject
Date: 2012-07-05 06:15 am (UTC)Так что сделаем другим путём.
no subject
Date: 2012-07-05 07:38 am (UTC)no subject
Date: 2012-07-07 06:24 am (UTC)no subject
Date: 2012-07-05 08:25 am (UTC)А что за другой путь? Чем он отличается?
no subject
Date: 2012-07-06 05:21 am (UTC)no subject
Date: 2012-07-06 06:37 am (UTC)no subject
Date: 2012-07-07 06:25 am (UTC)no subject
Date: 2012-07-07 06:54 am (UTC)range(0,3)не описка, я начинаю думать плохое.no subject
Date: 2012-07-07 10:44 am (UTC)Не описка.
Что именно плохое?
no subject
Date: 2012-07-07 05:51 pm (UTC)range(0,3)вместо нормальногоrange(3)? Первое, что приходит в голову (и наиболее вероятное) — опечатка или артефакт редактирования. Возможен ещё вариант разумного использования, если тут же рядом в коде есть range(1,4), range(2,5), range(-1,2) и т. п., причём в широком ассортименте. Но это очень, очень редкий случай. Остаётся ещё способности и вкусы кого-то, обладающего властью (чтобы принудить к этому питонистов), — т. е. просто самодурство.no subject
Date: 2012-07-08 06:53 am (UTC)То, что Вы не рассматриваете такую причину в принципе, а вместо этого придумываете какое-то "самодурство", говорит, что Вы не используете полезную экономию мышления. И это грустно.
no subject
Date: 2012-07-08 07:45 am (UTC)no subject
Date: 2012-07-10 06:48 pm (UTC)no subject
Date: 2012-07-05 06:26 am (UTC)> var a = []; for (i = 0; i < 3; i++) {a[i] = function() {console.log(i);}}; a[0]() 3