LINUX.ORG.RU
ФорумAdmin

Как в python запустить цикличное выполнение одного блока кода с разными переменными?

 , , , ,


0

1

Передаю я такой через API опенстека правило на назначение security rule вида

data_add = {'security_group_rule':{
            'from_port':'80',
            'to_port':'80',
            'ip_protocol':'tcp',
            'parent_group_id': sec_group_id,
            'cidr':'0.0.0.0/0',
            }
       }

Хочу автоматизировать этот процесс и подставлять значения 'from_port', 'to_port', 'ip_protocol' и 'cidr' в виде переменных значений и запускать по несколько раз, но с новыми значениями в установленых полях.

Вот гуглю и не совсем понимаю как это сделать.

★★★

Запрос у тебя должен быть в переменной типа String. Чтобы подставлять произвольные значения, ты должен каждый раз формировать эту переменную с подстановкой нужных значений. Конкатенация строк в питоне, если я не ошибаюсь, осуществляется оператором +.

CYB3R ★★★★★
()

Тред однострочников на пистоне?

a = lambda fromp, top, proto, cidr: {'security_group_rule':{ 'from_port': fromp,'to_port': top, 'ip_protocol': proto, 'parent_group_id': sec_group_id, 'cidr': cidr,}}

Deleted
()
Ответ на: комментарий от goingUp

Просто стринг

Но нужно как-то сделать так, чтоб на первый раз вызова скрипта например, 'from-port' равнялся '80', а на следующий - '443'.

И так далее.

dvrts ★★★
() автор топика
Ответ на: комментарий от PolarFox

стоит использовать string.format

Да, это будет более красивым решением.

CYB3R ★★★★★
()
Ответ на: комментарий от Deleted

А нужные мне значения куда подставлять?

На первый раз например мне нужно чтоб from = '80', на второй from = '443'

dvrts ★★★
() автор топика
Ответ на: комментарий от CYB3R

Слышал, но пока не понимаю как именно их тут использовать

dvrts ★★★
() автор топика
Ответ на: комментарий от PolarFox

как максимум import json

А с ним тут как?

dvrts ★★★
() автор топика

подставлять значения
в виде переменных значений
по несколько раз, но с новыми значениями

Обезьян полон ЛОР.

google://smart+questions

anonymous
()
Ответ на: комментарий от dvrts

Сделай функцию. В первый раз вызывай с 80 портом, второй с 443.

goingUp ★★★★★
()
def my_fun(from_port, to_port, ip_protocol, cidr):
    data_add = {'security_group_rule':{
        'from_port': from_port,
        'to_port': to_port,
        'ip_protocol': ip_protocol,
        'parent_group_id': sec_group_id,
        'cidr': cidr,
        }
    }

    # do something with `data_add`

И вызывай теперь в цикле my_fun с нужными значениями.

theNamelessOne ★★★★★
()
Последнее исправление: theNamelessOne (всего исправлений: 1)
Ответ на: комментарий от theNamelessOne

И вызывай теперь в цикле my_fun с нужными значениями.

Дальше идет запрос вида

 r_add = requests.post(url_add, data=json.dumps(data_add), headers=headers_add)

где url_add - это URL API-вызова, json.dumps(data_add) - собственно передача того куска json, который я указал в заглавном посту, ну и headers для аутентификации.

Как мне вызывать (точнее модифицировать мою) приведенную тобой конструкцию?

dvrts ★★★
() автор топика
Ответ на: комментарий от menangen

Ппц, ТС питон в глаза первый раз видит. Смотри, а то он тебя сожрёт! Почитай dive into python.

Не первый, но около того, да

dvrts ★★★
() автор топика

При чём здесь питон и Admin?

disarmer ★★★
()
Ответ на: комментарий от dvrts

Как мне вызывать (точнее модифицировать мою) приведенную тобой конструкцию?

def request_data(from_port, to_port, ip_protocol, cidr):
    return {'security_group_rule':{
        'from_port': from_port,
        'to_port': to_port,
        'ip_protocol': ip_protocol,
        'parent_group_id': sec_group_id,
        'cidr': cidr,
        }
    }

# ...

r_add = requests.post(url_add, data=json.dumps(request_data(from_port, to_port, ip_protocol, cidr)), headers=headers_add)

# ...

Ну или можно сделать так, чтобы запрос вызывался и обрабатывался внутри функции — разницы большой нет.

theNamelessOne ★★★★★
()
Ответ на: комментарий от theNamelessOne

запрос вызывался и обрабатывался внутри функции — разницы большой нет.

О, я вот так и сделал. За твой вариант тоже спасибо

dvrts ★★★
() автор топика

Можно, например, засунуть все значения в массив, а потому вызывать в цикле функцию с этими значениями и уничтожать первые 4 элемента массива. Костыльненько, но должно сработать. Питон не знаю, пишу как могу:

sub add_data {
    data_add = {'security_group_rule':{
            'from_port': $_[0]',
            'to_port': $_[1]',
            'ip_protocol': $_[2],
            'parent_group_id': sec_group_id,
            'cidr': $_[3],
            }
       }
};
@data = ("80", "80", "tcp", "0.0.0.0/0", "81", "81"; "udp"; "127.0.0.1");
while (@data) {
    add_data($data[0], $data[1]; $data[2]; $data[3]);
    splice @data, 0, 4;
}

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