LINUX.ORG.RU

Python и Tcl. Помогите разобраться !!!


0

0

Я долго работал на Tcl, в котором позволялись такие операции как:

set a_1 123 (присвоить переменной 'a_1' значение 123) set a_2 321 (присвоить переменной 'a_2' значение 321)

set b 1 (присвоить переменной 'b' значение 1)

set a_$b 999 после этой операции переменной 'a_1' будет присвоено значение '999' , т.е. tcl понимает, что 'a_$b' это переменная 'a_1'

Подскажите возможно ли в Python`е нечто похожее ?


принципе да:
>>> b = 1
>>> a_ = {}
>>> a_[str(b)] = 999;
>>>

только вот зачем это нужно?

lg ★★
()

Нет, это совсем не то, я имел ввиду вот какой случай. Заодно показываю как это можно использовать (для Tcl-а):

[root@data /]# tclsh
% proc test {i} {
global var_1
global var_2

return [set var_$i] #Т.е. я могу таким способом получить
значение уже существующей переменной
}
% global var_1, var_2
% set var_1 123
123
% set var_2 456
456
% set new_1 [test 1] # т.е. переменной new_1 присваивается значение
123 # глобальной переменной var_1
% puts "new_1 = $new_1"
new_1 = 123
%
% puts "new_2 = [test 2]"
new_2 = 456

А Вы, в своем примере, СОЗДАЕТЕ НОВУЮ переменную.

Olgert1
() автор топика

это понятно .. но не забываем что ты просил "нечто похожее" - то есть похожее, но не одно и тоже

lg ★★
()

Т.е. я так понимаю, что в Pythone таким образом добраться до значения переменной нельзя?

Olgert1
() автор топика

можно конечно .. но зачем?

>>> def test(i):
... global var_1
... global var_2
... return eval("var_"+str(i))
...
>>> var_1 = 123
>>> var_2 = 456
>>> new_1 = test(1)
>>> new_2 = test(2)
>>> print "new_1: %d, new_2: %d" %(new_1, new_2)
new_1: 123, new_2: 456
>>>

lg ★★
()

а зачем?

anonymous
()

Спасибо за подсказку!
А насчет того нужно ли это. Так, честно говоря, привык я к выражениям
таким. Была у меня в свое время задача вывода log-ов в два разных файла в зависимости от какого-то (не помню точно) параметра, и заненсения в разные списки определенных параметров. Я тогда сделал енто так:

output_fd_1
файловые дескр.
output_fd_0

koord_1
соответствующие списки
koord_2

proc loger{index var_1 var_2 text}{
global output_fd_1
global output_fd_0

global koord_1
global koord_2

puts [set output_fd_$index] "Текст сообщения: $text"

lappend koord_$index [list $var_1 $var_2]

}

Вот я и думаю можно ли делать точно также в Python-e

т.е. можно ли полученному с помощью eval() присвоить значение
или так можно только доставать значение ?

P.S.
Возможно можно делать гораздо лучше (в том же самом Tcl)

Olgert1
() автор топика

eval("XXX1") = XXX2 # недопустимно

Была у меня в свое время задача ....
для этого есть словари:
>>> import sys
>>> # XXX exceptions handling
>>> fd1 = open("/log/file/1", "r")
>>> fd2 = open("/log/file/2", "r")
>>> a = {}
>>> a["log1"] = [fd1, "/log/file/1"]
>>> a["log2"] = [fd2, "/log/file/2"]
>>> rld = sys.stdin.readline()
log1
>>> rld = rld[:-1]  # cut trailing \n
>>> if a.has_key(rld):
...   printf "file for %s is %s: repr=%s, descriptor=%d" %(rld, a[rld][1], repr(a[rld][0]), a[rld][0].fileno())
... else:
...   print "a has no file registred for %s" %rld
>>>

lg ★★
()

Спасибо, учту.

Olgert1
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.