我正在尝试编写一个带有两个Bots的脚本,然后将它们提供给引擎以供他们玩游戏。作为示例用法:
$:python rungame.py smartbot.py dumbbot.py
Detected SmartBot in smartbot.py...
Detected DumbBot in dumbbot.py...
Running game...
我遇到的问题是我不知道如何检测/获取通过命令行提供的模块中的Bot对象。 (如果它有帮助,我根本不介意执行约定。)我该怎么做?
答案 0 :(得分: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
所以我坚持让他们指定模块和类名的第一种方法。
答案 1 :(得分: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..."