Способ в Python, чтобы сделать VAR видимым в области вызова метода? - PullRequest
1 голос
/ 04 августа 2010

Я постоянно делаю что-то подобное, чтобы перетаскивать аргументы GET в переменные:

some_var = self.request.get('some_var', None)
other_var = self.request.get('other_var', None)
if None in [some_var, other_var]:
    logging.error("some arg was missing in " + self.request.path)
    exit()

Что я действительно хочу сделать, это:

pull_args('some_var', 'other_var')

И это как-то вытянетэти переменные должны быть доступны в текущей области, либо зарегистрировать ошибку и выйти, если нет (или вернуться к вызывающему методу, если это возможно).Возможно ли это в Python?

Ответы [ 2 ]

3 голосов
/ 04 августа 2010

Нет, это не так и бессмысленно.Запись во внешние пространства имен полностью разрушает назначение пространств имен, в которых находятся только те вещи, которые вы явно задаете.Используйте списки!

def pull_args(*names):
    return [self.request.get(name, None) for name in names]

print None in pull_args('some_var', 'other_var')

Возможно, это тоже работает, чтобы проверить, установлены ли все _var

print all(name in self.request for name in ('some_var', 'other_var'))
2 голосов
/ 04 августа 2010

Во-первых, отказ от ответственности: «вытягивать» переменные в локальную область любым другим способом, кроме var = something, действительно действительно действительно не рекомендуется.Это делает ваш код действительно запутанным для тех, кто не очень хорошо знаком с тем, что вы делаете (то есть с теми, кто не вы или кто вы 6 месяцев в будущем и т. Д.)

Это, как говорится, только для образовательных целей, есть способ.Ваша функция pull_args может быть реализована так:

def pull_args(request, *args):
    pulled = {}
    try:
        for a in args:
            pulled[a] = request[a]
    except AttributeError:
        logging.error("some arg was missing in " + self.request.path)
        exit()
    else:
        caller = inspect.stack()[1][0]
        caller.f_locals.update(pulled)

По крайней мере, кое-что на этот счет сработало, когда я придумал ее, вероятно, около года назад.Я не обязательно буду рассчитывать на продолжение работы в будущих версиях Python.(Еще одна причина не делать этого) Лично я никогда не находил веских причин использовать этот фрагмент кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...