Меняя имена переменной с Python для циклов [дубликат]

Это психоделический индикатор прогресса для bash-скриптинга от nExace. Его можно вызвать из командной строки как «./progressbar x y», где «x» - это время в секундах, а «y» - это сообщение, связанное с этой частью процесса.

Внутренняя функция progressbar () сама по себе также хороша, если вы хотите, чтобы другие части вашего скрипта управляли индикатором выполнения. Например, отправив «Индикатор прогресса 10« Создание дерева каталогов »; будет отображаться:

[#######                                     ] (10%) Creating directory tree

Конечно, это будет приятно психоделический, хотя ...

#!/bin/bash

if [ "$#" -eq 0 ]; then echo "x is \"time in seconds\" and z is \"message\""; echo "Usage: progressbar x z"; exit; fi
progressbar() {
        local loca=$1; local loca2=$2;
        declare -a bgcolors; declare -a fgcolors;
        for i in {40..46} {100..106}; do
                bgcolors+=("$i")
        done
        for i in {30..36} {90..96}; do
                fgcolors+=("$i")
        done
        local u=$(( 50 - loca ));
        local y; local t;
        local z; z=$(printf '%*s' "$u");
        local w=$(( loca * 2 ));
        local bouncer=".oO°Oo.";
        for ((i=0;i<loca;i++)); do
                t="${bouncer:((i%${#bouncer})):1}"
                bgcolor="\\E[${bgcolors[RANDOM % 14]}m \\033[m"
                y+="$bgcolor";
        done
        fgcolor="\\E[${fgcolors[RANDOM % 14]}m"
        echo -ne " $fgcolor$t$y$z$fgcolor$t \\E[96m(\\E[36m$w%\\E[96m)\\E[92m $fgcolor$loca2\\033[m\r"
};
timeprogress() {
        local loca="$1"; local loca2="$2";
        loca=$(bc -l <<< scale=2\;"$loca/50")
        for i in {1..50}; do
                progressbar "$i" "$loca2";
                sleep "$loca";
        done
        printf "\n"
};
timeprogress "$1" "$2"
23
задан S.Lott 29 June 2009 в 20:10
поделиться

4 ответа

Вероятно, вам нужен словарь вместо отдельных переменных. Например,

d = {}
for i in range(3):
    d["group" + str(i)] = self.getGroup(selected, header+i)

Если вы настаиваете на фактическом изменении локальных переменных, вы можете использовать функцию locals :

for i in range(3):
    locals()["group"+str(i)] = self.getGroup(selected, header+i)

С другой стороны, если вы действительно хотите изменить переменные экземпляра класса, который вы ' re in, то вы можете использовать функцию setattr

for i in group(3):
    setattr(self, "group"+str(i), self.getGroup(selected, header+i)

И, конечно же, со всеми этими примерами я предполагаю, что вам нужен не просто список:

groups = [self.getGroup(i,header+i) for i in range(3)]
44
ответ дан 29 November 2019 в 01:20
поделиться

Похоже, вы хотите использовать вместо этого список:

group=[]
for i in range(3):
     group[i]=self.getGroup(selected, header+i)
2
ответ дан 29 November 2019 в 01:20
поделиться

Используйте список.

groups = [0]*3
for i in xrange(3):
    groups[i] = self.getGroup(selected, header + i)

или более "Pythonically":

groups = [self.getGroup(selected, header + i) for i in xrange(3)]

Что бы это ни стоило, вы могли попытаться создать переменные "неправильным" способом, т. Е. путем изменения словаря, в котором хранятся их значения:

l = locals()
for i in xrange(3):
    l['group' + str(i)] = self.getGroup(selected, header + i)

, но это действительно плохой тон, и, возможно, даже не гарантируется его работа.

8
ответ дан 29 November 2019 в 01:20
поделиться

Вы могли получить доступ к атрибуту __ dict __ вашего класса:

for i in range(3)
     self.__dict__['group%d' % i]=self.getGroup(selected, header+i)

Но почему вы не можете просто использовать массив с именем group ?

-1
ответ дан 29 November 2019 в 01:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: