Увеличение целого числа с использованием строки имени переменной - PullRequest
1 голос
/ 19 марта 2020

Я делаю следующее в интерпретаторе python, и он работает:

rhce=rhcsa=0
args=['rhce','rhcsa']
for cert in args:
    exec(cert+'+=1')
    print(eval(cert))

>>> 1
>>> 1

Как видите, переменная увеличивается, независимо от того, используете ли вы print (rhce) или print (eval (cert) )). Однако, когда я помещаю точно такой же фрагмент кода в функцию класса, он больше не работает. Не выдается никаких исключений, но переменная никогда не увеличивается. Это как exe c не работает:

def addCertUser(self,userid,args):
    rhcsa=rhce=0

    print(args)
    try:
        for cert in args:
            exec(cert+'+=1')
            print(eval(cert))
    except Exception as e:
        print(e)


>>> ['rhce', 'rhcsa']
>>> 0
>>> 0

Что мне здесь не хватает?

Ответы [ 2 ]

0 голосов
/ 19 марта 2020

Это не очень хорошая идея, чтобы проверить или запустить c код, в 99 случаях из 100 есть лучший способ сделать это. В этом случае, если у вас нет какой-либо другой причины, которая действительно должна использовать eval и exe c, вы можете добиться того, что вы пытаетесь с помощью dict. он может содержать клавишу («имя»), используемую для ссылки или поиска вашего значения довольно безопасно.

class MyClass:
    def __init__(self):
        self.my_counts = {
            'rhce': 0,
            'rhcsa': 0
        }
    def add_cert_user(self, userid, args):
        print("start of function", self.my_counts)
        for cert in args:
            if cert  in self.my_counts:
                self.my_counts[cert] += 1
        print("end of function", self.my_counts)

me = MyClass()
args = ['rhce','rhcsa']
me.add_cert_user("test", args)
me.add_cert_user("test", args)
me.add_cert_user("test", args)

ВЫХОД

start of function {'rhce': 0, 'rhcsa': 0}
end of function {'rhce': 1, 'rhcsa': 1}
start of function {'rhce': 1, 'rhcsa': 1}
end of function {'rhce': 2, 'rhcsa': 2}
start of function {'rhce': 2, 'rhcsa': 2}
end of function {'rhce': 3, 'rhcsa': 3}
0 голосов
/ 19 марта 2020

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

Использование exe c изменение локальных переменных не гарантирует какого-либо результата, как вы можете видеть в документации к функции exe c, и ее следует избегать.

См. Другой подробный ответ здесь и здесь

...