2015-02-09 134 views
0

我正在用Django編寫一些東西,它變得有點亂。我試圖創建一個應用程序,它可以從可上載的Python模塊運行並返回數據,並帶有用於調用函數的文本輸入字段。 大部分工作,我可以調用沒有參數的函數。 問題是與進入需要的參數功能,則傳遞到Python是字符串形式的任何輸入,這意味着如果我輸入:param('a',[foo])調用的函數:根據其內容更改python變量

def param(a,b): 
    return "Hello world" + a + b 

該函數將返回:

"Hello world'a'[foo]" 

基本上我需要一種方法來獲取一個字符串並將其轉換爲文字python代碼...如果這是可能的,這樣我可以把這個輸入框當作它是python控制檯。

任何想法?任何幫助將非常歡迎!我意識到這不是一種非常pythonic的做事方式。

編輯由於擔心安全問題:我不太擔心安全問題,因爲這隻會是一個本地項目。

+4

你可以用'eval',但它是危險的,這樣對用戶輸入。 – 2015-02-09 19:57:58

+1

一定要知道你在那裏做什麼。運行上傳的代碼會打開幾個安全問題!我不知道你在建什麼,但是想一想,如果這真的是必要的,以及如何使它安全... – kratenko 2015-02-09 20:00:12

+2

@ Alistair401更好的問題是爲什麼你認爲這是解決這個問題的正確方法(提示:它不) – 2015-02-09 20:00:50

回答

1

可以使用ast.literal_eval,它比的eval更有限,但不造成的風險:

安全評估的表達式節點或Unicode或含有一個Python字面或容器顯示Latin-1的編碼的字符串。提供的字符串或節點可能只包含以下Python文字結構:字符串,數字,元組,列表,字典,布爾值和無。

from ast import literal_eval 

def param(a,b): 
    return "Hello world" + literal_eval(a) + literal_eval(b) 

In [9]: param('" foo"', "'bar'") 
Out[9]: 'Hello world foobar' 

您可以使用try /除了趕上,當你想a或b只是意味着是字符串:

1

您可以使用eval

def param(a, b): 
    return "Hello world" + eval(a) + eval(b) 

如果試圖將字符串和列表。但它一定會產生一個錯誤:

>>> param('", an unsafe world!"', '"!!!"') 
'Hello world, an unsafe world!!!!' 

>>> param('", an unsafe world!"', '[]') 
TypeError: cannot concatenate 'str' and 'list' objects 

由於擺脫了引號的,我想你可以加了引號自己(如eval('"{0}"'.format(a)))或使用Padraic提出的ast.literal_eval()