Как добавить параметр функции в качестве суффикса для каждой переменной внутри этой функции? - PullRequest
1 голос
/ 16 июня 2019

Я пытаюсь разработать функцию, которая создает новую вкладку со многими объектами Tkinter (ярлыками, кнопками, спинбоксами и т. Д.). Затем назначьте эту функцию многим кнопкам (с номером кнопки в качестве параметра функции), расположенным в корневом окне. Я хочу переименовать переменные внутри тела функции, добавив к их исходным именам суффикс, который является параметром функции. Кроме того, одна из переменных является глобальной (используется в качестве счетчика).

var_1 = 0
var_2 = 0

def relay_btn(relay_number):
    var_n = 'var_' + str(relay_number)
    global var_n
    vars()[var_n] = 0 + relay_number

relay_btn(1)
relay_btn(2)

print(var_1)
print(var_2)

В результате я бы хотел видеть 1 и 2 соответственно, а не 0.

1 Ответ

0 голосов
/ 16 июня 2019

Когда вы вызываете vars () внутри функции relay_btn, вы по-прежнему обращаетесь к переменным в области действия этой функции.

Здесь я возвращаю их в глобальную область с помощью return и назначаюпеременных там.

#!/usr/bin/env python3

var_1 = 0
var_2 = 0

def relay_btn(relay_number):
        var_n = "var_" + str(relay_number)
        return var_n, relay_number

var_n, value = relay_btn(1)
vars()[var_n] = value
var_n, value = relay_btn(2)
vars()[var_n] = value

print(var_1)
print(var_2)

Это не так просто сделать все внутри функции с динамически генерируемым именем переменной .. Так как вы не можете использовать eval с присваиваниями ... но я надеюсь, что яможет убедить вас найти другой способ сделать то, что вы делаете с этим .. это обычно считается плохой идеей.Есть ли причина, по которой вы не можете использовать структуру данных, предназначенную для хранения динамически сгенерированных ассоциаций значений ключей, таких как словарь?

#!/usr/bin/env python3

d = {}

d["var_1"] = 0
d["var_2"] = 0

def relay_btn(relay_number, d):
        d["var_{}".format(relay_number)] = relay_number

relay_btn(1, d)
relay_btn(2, d)

print(d["var_1"])
print(d["var_2"])
...