2016-11-28 58 views
-1

我有幾個類在代碼上導入,但我只需要實例化文本文件中列出的那些類。所以,我有這樣的事情Python:從具有參數的文件中的字符串實例化一個類

from module1 import c1 
from module2 import c2 
... 

,並在文本文件中我只有我想要實例像

c1() 
c2(True) 
... 

所以我想讀取的文件行的列表(這些類的列表類)並做類似

for i in classes: 
    classes_list.append(i) 

以便列表中的每個元素都是一個實例化的類。我試着這樣做基於其他的解決方案,我發現這裏

for i in classes: 
    classes_list.append(globals()[i]) 

,但我總是得到這個錯誤

KeyError: 'c1()' 

KeyError: 'c2(True)' 

任何想法如何這樣的可能呢?

+0

有沒有你不想要使用的理由[' pickle'](HTTPS://docs.p ython.org/3/library/pickle.html)而不是這個奇怪的文本格式? – Kevin

+0

不是真的,任何工作對我來說都很好。唯一的要求是需要從文本文件中讀取班級列表,因爲其他人將定義他們想要使用的班級,並且我無法知道他們會選擇哪些班級。另外,人們可能希望c2的True或False作爲參數,我也無法知道 – Atirag

+1

這些線條有多複雜? 'c2(真)'好吧我可以有真/假。我可以有多個參數嗎?整型?數學如何(例如'c2(1 + 3)')?你正在這裏定義一個迷你語言,這可能會變得困難。你可以爲文件中的每一行做'eval(line)',這樣用戶就可以添加完整的python表達式,比如調用多個函數'c2(c1())'。 – tdelaney

回答

1

您正在實現一種表達如何調用某些功能的迷你語言。這可能會變得困難,但事實證明python已經使用eval函數實現了自己的迷你語言。用eval,python會編譯並執行python表達式。

對於來自網絡中匿名和潛在惡意用戶的內容,這被認爲是有風險的,但對於擁有某種信任級別的人來說,這可能是一個合理的解決方案。例如,如果撰寫這些文件的人員在您的組織中,並且無論如何都可能會讓您陷入千方百計的狀態,那麼您可以通過這種方式來信任他們。我實現了一個系統,人們可以編寫測試代碼的片段,我的系統會將其全部包裝起來,並將其轉換爲測試套件。沒有問題,因爲這些人已經完全訪問了測試系統。

module1.py

def c1(p=1): 
    return p 

def c2(p=1): 
    return p 

def c3(p=1): 
    return p 

test.py

import module1 

my_globals = { 
    'c1': module1.c1, 
    'c2': module1.c2, 
    'c3': module1.c3, 
} 

test = ["c1()", 
    "c2(p=c1())", 
    "c3('i am a string')", 
    "c1(100)"] 


for line in test: 
    print(line.strip() + ':', eval(line, my_globals)) 

結果

c1(): 1 
c2(p=c1()): 1 
c3('i am a string'): i am a string 
c1(100): 100 
相關問題