2011-09-24 104 views
3

我正在嘗試編寫一個需要兩個機器人的腳本,然後將它們提供給引擎供他們玩遊戲。作爲一個例子用法:如何從Python模塊中提取類?

$:python rungame.py smartbot.py dumbbot.py 
Detected SmartBot in smartbot.py... 
Detected DumbBot in dumbbot.py... 
Running game... 

我遇到的問題是,我不知道如何檢測/獲取機器人對象了通過命令行提供的模塊。 (如果它有幫助,我根本不會介意執行約定。)我該怎麼做?

回答

3

您可能需要類名稱以及模塊名稱。就這樣,你可以這樣做:

getattr(__import__(module_name), class_name) 

如果你不想讓他們指定一個類名,你或許能找到一類與Bot結束:

module = __import__(module_name) 
clazz = None 
for attribute_name in dir(module): 
    attribute = getattr(module, attribute_name) 
    if attribute_name.endswith('Bot') and callable(attribute): 
     clazz = attribute 
     break 

然而:

顯式優於隱式。 - The Zen of Python

所以我跟讓他們指定模塊和類名的第一種方法堅持下去。

+0

雖然可能無關的應用程序,它似乎[WERKZEUG有一些功能(HTTP://werkzeug.pocoo .org/docs/utils /#werkzeug.utils.import_string),它也可以導入類似的對象。 – icktoofay

1

此問題最常見的模式之一是在您的API中定義對象必須具有特定的名稱;例如,你可能稱之爲特變bot

# smartbot.py 
class SmartBot(object): 
    "A very smart bot!" 

bot = SmartBot() 
# dumbbot.py 
class DumbBot(object): 
    "A dumb bot bot!" 

bot = DumbBot() 
# rungame.py 
import sys 
for source in sys.argv[1:]: 
    l = {} 
    execfile(source, l) 
    bot = l["bot"] 
    print "Detected %s in %s..." % (type(bot).__name__, source) 
print "Running game..."