Python, scopes
От: Lorenzo_LAMAS  
Дата: 15.09.10 13:51
Оценка:
Не знаю, в каком из форумов лучше спросить, потому спрошу здесь.

Из офиц. туториала Питона 3.1:

On the other hand, the actual search for names is done dynamically, at run time — however, the language definition is evolving towards static name resolution, at “compile” time, so don’t rely on dynamic name resolution! (In fact, local variables are already determined statically.)


как собственно должна выглядеть программа, которая полагается на динамическое разрешение имен, а не на статическое?


16.09.10 13:51: Перенесено модератором из 'Философия программирования' — WolfHound
Of course, the code must be complete enough to compile and link.
Re: Python, scopes
От: Lorenzo_LAMAS  
Дата: 15.09.10 13:54
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:


L_L>

L_L>On the other hand, the actual search for names is done dynamically, at run time — however, the language definition is evolving towards static name resolution, at “compile” time, so don’t rely on dynamic name resolution! (In fact, local variables are already determined statically.)


L_L>как собственно должна выглядеть программа, которая полагается на динамическое разрешение имен, а не на статическое?

в общем-то, интересно, какой код может поломаться в будущем.
Of course, the code must be complete enough to compile and link.
Re: Python, scopes
От: Lloyd Россия  
Дата: 15.09.10 14:32
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

L_L>как собственно должна выглядеть программа, которая полагается на динамическое разрешение имен, а не на статическое?


def static_f():
    inc = 100
    return lambda x: x + inc

def dyn_f():
    inc = 100
    return lambda x: x + eval('inc')

func = static_f()
print func(1)

inc = 1000

func = dyn_f()
print func(1)

Пойдет?
Re[2]: Python, scopes
От: Lorenzo_LAMAS  
Дата: 15.09.10 16:21
Оценка:
L>
L>def static_f():
L>    inc = 100
L>    return lambda x: x + inc

L>def dyn_f():
L>    inc = 100
L>    return lambda x: x + eval('inc')

L>func = static_f()
L>print func(1)

L>inc = 1000

L>func = dyn_f()
L>print func(1)
L>

L>Пойдет?

подошел бы, если бы собирались поменять правила, как eval должен работать , но ведь это не так?
(просто, мое внимание привлекла фраза о будущих возможных изменениях, к сожалению, без конкретики)
Of course, the code must be complete enough to compile and link.
Re[2]: Python, scopes
От: Temoto  
Дата: 16.09.10 10:10
Оценка:
L_L>>

L_L>>On the other hand, the actual search for names is done dynamically, at run time — however, the language definition is evolving towards static name resolution, at “compile” time, so don’t rely on dynamic name resolution! (In fact, local variables are already determined statically.)


L_L>>как собственно должна выглядеть программа, которая полагается на динамическое разрешение имен, а не на статическое?

L_L>в общем-то, интересно, какой код может поломаться в будущем.


Может быть, что-то в районе читать/писать в globals/locals...
Re: Python, scopes
От: Mr.Cat  
Дата: 16.09.10 10:53
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:
L_L>

L_L>On the other hand, the actual search for names is done dynamically, at run time — however, the language definition is evolving towards static name resolution, at “compile” time, so don’t rely on dynamic name resolution! (In fact, local variables are already determined statically.)


В принципе, типичный лиспер уже вот такую ситуацию не считает статикой:
if condition1:
  a = 1
elif condition2:
  a = '!!!1111eleven'
else
  pass

print a
Re[2]: Python, scopes
От: Lorenzo_LAMAS  
Дата: 16.09.10 11:05
Оценка:
MC>В принципе, типичный лиспер уже вот такую ситуацию не считает статикой:
MC>
MC>if condition1:
MC>  a = 1
MC>elif condition2:
MC>  a = '!!!1111eleven'
MC>else
MC>  pass

MC>print a
MC>


Насколько я понимаю, в Питоне подобное останется всегда, даже в свете изменений towards static name resolution — т.е. это легальный код, который может привести к исключению и таковым он и останется.
Кстати, вопрос по "стилю" — нормально ли в питоне писать что-то вроде такого:

... здесь никакого binding'a 'a' не было
if cond:
   a = ....
else
   a = ....
.....  use a


Т.е. не писать какой-то инициализации 'а' до if?
Of course, the code must be complete enough to compile and link.
Re[3]: Python, scopes
От: Mr.Cat  
Дата: 16.09.10 11:10
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:
L_L>Кстати, вопрос по "стилю" — нормально ли в питоне писать что-то вроде такого:
...
L_L>Т.е. не писать какой-то инициализации 'а' до if?
Я сам не питонист (поэтому не знаю, что там у них считается кошерным), но в простых случаях (когда переменная инициализируется в обеих ветках, просто по-разному) так и пишу.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.