将实例作为函数参数传递
我写了一个小应用,可以获取雅虎天气信息并把它发布到推特上。这个应用运行得非常顺利,现在我想把代码整理成不同的文件,命名得更合理一些。结果我遇到了一些问题。
之前,我在一个叫 libtweather.py
的文件里定义了一个 Class
,它代表我的 account
。这个 Class
让我可以用 accountName.parseFeed()
来获取解析后的雅虎天气信息。(__ini__
方法需要天气网址、推特用户名和密码作为参数)
这个 Class
是从我的主脚本中访问的,主脚本通过下面的方式创建了这个 Class
的实例:
exec '%s = lw.twitterWeather("%s", "%s", "%s")' % (item[0], item[1], item[2], item[3])
它还保持了一份所有账户名称的列表,并把这个列表作为参数传递给其他函数。
还有一个函数 getWeather
是这样获取天气的:
def getWeather(accountList): #account names passed as a list of strings
for item in accountList:
print item, ': ',
item = eval(item)
print item.parseFeed(), '\n
我现在决定把 getWeather
函数移动到和 Class
在同一个文件里,但 item = eval(item)
这一行让我遇到了麻烦,因为在这个文件里没有创建任何实例,所有实例都在主脚本里。
现在我的问题是:有没有办法把那些实例作为参数传递给这个函数?还是说我必须把这个函数放到 Class
里?即使我这么做了,我还是需要对列表里的多个项目执行 item.parseFeed()
,所以我还是需要 item = eval(item)
,对吧?
谢谢大家。我的应用程序有点复杂,不能全部贴在这里,但如果需要的话,我会贴更多代码以便更好地理解。
更新:我最终在运行 libtweather.py
时创建了实例,这样当它被导入时,里面的函数就可以访问这些实例(我在脚本底部添加了实例生成的代码)。我知道可能有更好的方法,但目前这样对我来说有效,我也觉得可以。
1 个回答
你应该用一个明确的字典来存储这些项目。像 eval
、exec
、globals
、locals
和 vars
这些方法都很糟糕,使用起来也很傻。记住《Python之禅》里的话:“明确总比隐含好。”
feeds = {}
for item in whatever:
feeds[item[0]] = lw.twitterWeather(*item[1:])
def getWeather(feeds, accountList):
for item in accountList:
print '%s: %s' % (item, feeds[item].parseFeed())