2010-08-03 57 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'))