2010-06-24 21 views
2

我想在一個不同的模塊中有一個函數,當它被調用時,它可以訪問其調用者可以訪問的所有變量,並且就像它的主體被粘貼到調用者而不是擁有自己的上下文,基本上像C宏而不是普通函數。我知道我可以將locals()傳入函數,然後它可以作爲字典訪問局部變量,但我希望能夠正常訪問它們(例如xy,而不是x [「y」],並且我希望所有名稱都是調用者可以訪問不只是當地人,還有那被「進口」到調用的文件,但沒有到包含功能模塊的東西。調用python函數就好像它是內聯的

這是可能的決絕?

編輯2這裏有一個最簡單的例子,我可以拿出我真正想要做的事:

def getObj(expression) 
    ofs = expression.rfind(".") 
    obj = eval(expression[:ofs]) 
    print "The part of the expression Left of the period is of type ", type(obj), 

問題是'表達式'需要調用者的導入和局部變量,以便無誤地評估。在現實中,這不僅僅是一個評估,所以我試圖避免僅僅傳遞本地()的解決方案到eval(),因爲那不能解決我的一般情況問題。

+5

是的,你可以這樣做,但你可能不應該添加神奇的語言功能,因爲可憐的下一個人閱讀你的代碼。有一個原因是C預處理器宏最好不要使用:它們以神祕的方式改變語言。 – msw 2010-06-24 21:37:10

+1

你應該問問題而不是(很好)*非常*解決方案。 – 2010-06-24 23:05:06

+0

@ THC4k- 5000英尺視圖是我幾周前發佈的這個問題,但沒有得到任何答案:http://stackoverflow.com/questions/3027307/listing-all-possible-values-for-soap-用python-suds枚舉 我試圖得到這個問題的一般情況下的解決方案 – bdk 2010-06-25 01:26:06

回答

2

我不認爲這是你想聽到的答案,但試圖從調用者模塊的範圍訪問局部變量不是一個好主意。如果你通常用PHP或C編程,你可能習慣了這種事情?

如果您仍然想這樣做,則可以考慮創建一個類,並在地方傳遞一個實例類的locals()

#other_module.py 
def some_func(lcls): 
    print(lcls.x) 

然後,

>>> import other_module 
>>> 
>>> 
>>> x = 'Hello World' 
>>> 
>>> class MyLocals(object): 
...  def __init__(self, lcls): 
...    self.lcls = lcls 
...  def __getattr__(self, name): 
...    return self.lcls[name] 
... 
>>> # Call your function with an instance of this instead. 
>>> other_module.some_func(MyLocals(locals())) 
'Hello World' 

試一試。

+3

我接受這個答案,因爲我認爲它給出了我原來的問題的最佳答案,給出了我之後的語法,但是在閱讀完所有回覆之後,我將看看是否可以更改接口規範以避免必須執行此操作 – bdk 2010-06-25 00:11:34

2

這有可能拉斷嗎?

是的(有點兒,以非常迂迴的方式),我一般會強烈反對它(稍後會介紹更多)。

考慮:

myfile.py

def func_in_caller(): 
    print "in caller" 

import otherfile 
globals()["imported_func"] = otherfile.remote_func 

imported_func(123, globals()) 

otherfile.py

def remote_func(x1, extra): 
    for k,v in extra.iteritems(): 
     globals()[k] = v 
    print x1 
    func_in_caller() 

該收益率(預期):

123 
in caller 

我們做什麼在這裏是欺騙性的:我們只是將每個項目複製到另一個命名空間以完成此項工作。這可以(和)很容易中斷和/或導致很難找到錯誤。

幾乎可以肯定有更好的方式來解決你的問題/構建你的代碼(我們需要更多的信息來總體說明你要實現的目標)。

+0

甚至在'remote_func'中,只是'locals()。update(extra)''。少一點混亂。 – gilesc 2010-06-24 21:49:52

+0

謝謝,我將用我想要做的更大背景來編輯我的問題 – bdk 2010-06-24 22:03:28

2

Zen of Python

2)顯式優於隱式。

換句話說,傳遞參數,不要因爲你認爲它會更容易就變得很花哨。編寫代碼不僅僅是關於你。

+0

不確定我是否遵循,一旦我傳遞了實際變量,My函數就會獲取當前值,並且可以不執行需要知道實際路徑字符串的wsdl反射。 – bdk 2010-06-24 22:26:24

2

而另一位,甚至醜陋的方式來做到這一點 - 請不要這樣做,即使是可能的 -

import sys 

def insp(): 
    l = sys._getframe(1).f_locals 
    expression = l["expression"] 
    ofs = expression.rfind(".") 
    expofs = expression[:ofs] 
    obj = eval(expofs, globals(), l) 
    print "The part of the expression %r Left of the period (%r) is of type %r" % (expression, expofs, type(obj)), 

def foo(): 
    derp = 5 
    expression = "derp.durr" 
    insp() 

foo() 

輸出

表達「DERP的一部分。 ('derp')是類型('int')類型(類型'int')

相關問題