У меня есть следующий код:
class foo():
def __init__(self, local_dict):
self.local_dict = local_dict
def acquire(self, foreign_dict, *args):
to_exec = ''
for arg in args:
to_exec += ('.get(\'%s\', {})' %arg)
, где вызов foo.acquire(some_dict, 'CLIENT1', 'OWED')
делает to_exec
выглядит примерно так:
.get('CLIENT1', {}).get('OWED', {})
, который предназначен для доступа к произвольно глубоко вложенному словарю foreign_dict
, гарантируя, что неудачная попытка не заблокирует программу. Моя проблема в том, как мне запустить эту строку, как если бы она вызывала метод dict, т.е. как мне вернуть что-то вроде этого:
return foreign_dict.get('CLIENT1', {}).get('OWED', {})
если все, что у меня есть, это строка '.get('CLIENT1', {}).get('OWED', {})'
?
В моем коде все в порядке, если я сделаю следующее:
def acquire(self, *args):
to_exec = 'self.local_dict'
for arg in args:
to_exec += ('.get(\'%s\', {})' %arg)
return eval(to_exec)
Но здесь все работает нормально, потому что я знаю имя переменной self.local_dict
и он не берется из входа. Есть ли способ заставить строку работать, как если бы она была связана с оператором точки с внешним входом, т.е. заставить ее работать как return foreign_dict.get('CLIENT1', {}).get('OWED', {})
? Есть что-то вроде: dot_operator(foreign_dict, eval(to_exec))
? Потому что foreign_dict.eval(to_exec)
не работает.