我写了一个很棒的小应用程序,获取雅虎天气信息并将其发布到Twitter。它完美无瑕地工作,现在我想将代码重新排列成不同命名的文件,因此它更有意义。那是我遇到一些问题的时候。
以前,我在Class
中有一个libtweather.py
。这是我account
。它允许我做accountName.parseFeed()
并且我得到解析的雅虎天气的输出。 (__ini__
将天气网址,推特用户名和密码视为args)
这是从我的主脚本访问的,它创建了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
来创建实例,以便其中的函数可以访问它们(在脚本底部添加实例生成代码) 。我确信有一种更好的方法,但它目前适用于我,我很好。
答案 0 :(得分:5)
您应该使用显式dict来存储这些项目。 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())