2010-08-03 59 views
1

我发现自己做这样的事情不断拉GET ARGS到瓦尔:Python中的方法使调用方法范围中的变量可见?

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

首先,声明:“拉”变量成比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版本中工作。 (另一个原因不这样做)我个人从来没有找到一个很好的理由来使用这段代码片段。

+0

我被说服去使用列表,但我接受这个,因为它包含我要求的答案。 – Bemmu 2010-08-03 22:19:03

3

不,它不是也没有意义。写入外部命名空间完全破坏了命名空间的目的,命名空间只包含你明确设置的东西。使用列表!

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'))