将实例作为函数参数传递

时间:2010-08-14 19:03:19

标签: python oop function instance

我写了一个很棒的小应用程序,获取雅虎天气信息并将其发布到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来创建实例,以便其中的函数可以访问它们(在脚本底部添加实例生成代码) 。我确信有一种更好的方法,但它目前适用于我,我很好。

1 个答案:

答案 0 :(得分:5)

您应该使用显式dict来存储这些项目。 evalexecglobalslocalsvars都是非常愚蠢的方式来做这件事。请记住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())