Оцените строку, как если бы она была связана оператором точки - PullRequest
0 голосов
/ 02 августа 2020

У меня есть следующий код:

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) не работает.

1 Ответ

3 голосов
/ 02 августа 2020

Чтобы строго ответить на ваш ответ с помощью eval, возможно, вам нужен параметр locals из eval (eval имеет 3 параметра):

     def acquire(self, foreign_dict, *args):
         to_exec = 'foreign_dict'
         for arg in args:
             to_exec += ('.get(\'%s\', {})' %arg)
         return eval(to_exec, globals(), {'foreign_dict': foreign_dict})

Но в вашем случае вам, кажется, действительно не нужно использовать eval. Вы можете просто переназначить переменную в al oop и сделать с ней get. Что-то вроде

temp = foreign_dict.get(args[0], {})
for arg in args[1:]:
    temp = temp.get(arg, {})
return temp
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...