将实例作为函数参数传递

2 投票
1 回答
2539 浏览
提问于 2025-04-16 02:47

我写了一个小应用,可以获取雅虎天气信息并把它发布到推特上。这个应用运行得非常顺利,现在我想把代码整理成不同的文件,命名得更合理一些。结果我遇到了一些问题。

之前,我在一个叫 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 个回答

5

你应该用一个明确的字典来存储这些项目。像 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())

撰写回答