Вы действительно должны избегать использования глобальных переменных. В любом случае, вот как это сделать:
class example:
def fun1(self):
# globals sent # Not needed in this special case.
exec("sent = {}", globals())
print('in fun1, "sent" is now', sent )
v = example()
print(v.fun1()) # Result will be None because fun1() doesn't return anything.
print('after call to fun1(), global "sent" is', sent)
Выход:
in fun1, "sent" is now {}
None
after call to fun1(), global "sent" is {}
Объявление global
делает что-то только внутри метода функции или класса и даже тогда необходимо только тогда, когда значение глобальной переменной будет установлено на что-то.
Однако, как особый случай, в методе fun1()
он на самом деле не нужен, потому что он явно передает globals()
(но не отдельный локальный запрос), когда он вызывает exec()
. В любом случае, было бы неплохо добавить его, чтобы было более понятно, что происходит.
Использование exec()
таким образом объясняется в его документации , которая гласит:
Если указываются только глобальные переменные, это должен быть словарь, который будет использоваться для как глобальной, так и локальной переменных.
(выделено мое)
Вот способ вообще не ссылаться на глобальную переменную в методе:
class example:
def fun1(self):
namespace = {}
exec("sent = {}", namespace)
sent = namespace['sent'] # Retrieve result.
print('in fun1, "sent" is now', sent )
return sent
v = example()
sent = v.fun1()
print('after calling fun1(), "sent" got set to', sent)
Выход:
in fun1, "sent" is now {}
after calling fun1(), "sent" got set to {}