2013-08-20 41 views
1

我有一個類。在那個課上我有一個功能。 在函數中,我有一個字符串變量,它保存了幾個python函數的定義。如何從Python的全局範圍運行「exec」

我想從功能創建這樣,他們將在全球範圍創建的變量中定義的功能。

完成此操作後,我希望能夠從全局範圍調用新函數。

例如:

class MyClass: 
    def create_functions(): 
    functions_to_create = """ 
def glob1(): 
    return "G1" 

def glob2(): 
    return "G2" 
""" 
    # ----> HERE IS THE MISSING PART, LIKE RUNNING exec in the global scope <---- 


# The following function should work: 
def other_function_in_global_scope(): 
    print "glob1: %s, glob2: %s" % (glob1(), glob2()) 

應該是什麼在缺失的部分?

在此先感謝!

+0

運行EXEC因爲通常有更好的方法來設計代碼,同時也引入了潛在的非常容易的代碼注入。你想用字符串函數名稱做什麼?你爲什麼把它們當作字符串而不僅僅是對象? – Zimm3r

+0

@ Zimm3r:我想給內部客戶一個選項來編寫我想在我的代碼中使用的一些python代碼覆蓋。 – diemacht

+1

這聽起來並不完美,因此讓它們注入任意代碼會帶來安全風險。還有更好的方法,然後使用exec甚至可以注入字符串源代碼。 (更新的方式來做到這一點) – Zimm3r

回答

2

在python中,覆蓋可以在任何時候對任何東西進行猴子補丁,但是如果您只是在全局命名空間中評估一些代碼,那麼無意中會出現符號衝突的風險。我會建議客戶提供一個模塊,如果他們在那裏定義(否則默認實現),你的代碼會調用它中的函數。

這就是說,documentation建議:很少推薦

exec(functions_to_create, globals()) 
1

首先有幾件事。你有什麼理由創建一個函數來創建其他功能?你想做什麼?可能有更好的方法。另外這裏也是所謂的創建函數的另一種方式,它不涉及exec。

>>> def create_functions(): 
...  global glob1 
...  def glob1(): 
...    return "G1" 
... 
>>> glob1() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'glob1' is not defined 
>>> create_functions() 
>>> glob1() 
'G1' 
>>> 

編輯


注入無EXEC源代碼(這不是一個好主意,在所有

你有客戶提交他們的代碼,然後只是做一個自定義的導入

  1. Cust奧馬爾代碼提交
  2. 保存代碼爲說custom.py
  3. 在你的代碼,你想讓客戶注入做類似下面

    進口OS 如果os.path.exists(」 custom.py「): 進口關稅 custom.inject()

這樣,他們可以給你自己的代碼調用注入,他們可以改變的事情。