【问题标题】:Pass instance as function argument将实例作为函数参数传递
【发布时间】:2011-03-29 22:07:34
【问题描述】:

我编写了一个不错的小应用程序,它可以获取 Yahoo 天气信息并将其发布到 Twitter。它完美无缺,现在我想将代码重新排列成不同命名的文件,这样更有意义。那是我遇到一些问题的时候。

以前,我在libtweather.py 中有一个Class。这是我的account。它允许我做accountName.parseFeed() 并且我会得到解析的雅虎天气作为输出。 (__ini__ 将天气 URL、推特用户名和密码作为参数)

这是从我的主脚本访问的,该脚本创建了 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 以在导入实例时创建实例,以便其中的函数可以访问它们(在脚本底部添加了实例生成代码)。我敢肯定有更好的方法,但它目前对我有用,我可以接受。

【问题讨论】:

  • 您选择使用exec 制作类的实例有什么具体原因吗?
  • 没有。除了这是我在谷歌上遇到的第一种方式。我知道我可以使用globals()vars()locals()。我现在正在查看它们,看看我要使用哪一个。
  • 如果您发现自己需要使用evalexec,请不要使用。做点别的。永远不要使用它们。除非您当然需要,否则这就是它们存在的原因,但在您知道您需要它们之前,您必须知道没有没有其他好方法可以做些什么你要。几乎从来没有这种情况。
  • 谢谢,我会看看不同的方法。 execeval 是我开始学习 Python 时唯一知道的事情。我还在学习..

标签: python oop function instance


【解决方案1】:

您应该使用显式字典来存储这些项目。 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())

【讨论】:

  • 我从没想过字典。这个应用程序是我开始学习 Python 的方式,我最近才开始意识到 dicts 的惊人之处。但是,如果我在与 Class 相同的文件中定义了 getWeather 并且我在我的主脚本中生成实例(与 Class 文件分开),我可以将此 dict 作为参数传递给我的函数并让实例指向正确的位置(在 Class 文件中,该函数不能有lw.whatever,因为lw 永远不会被导入。)感谢*item[1:];不知道你能做到。 对不起,我对这一切还是有点陌生​​:P
  • 所以我终于改变了这个。让我的函数使用 dict 而不是我以前拥有的,并没有做太多的改变。虽然我没有使用与我最初的问题相同的组织(我在我的 libtweather.py 中创建实例,而不是在主脚本中),但我尝试将 dict 从我的libtweather.py 中传递给主脚本,它工作。实例被无误地接受。所以回答被接受。谢谢!
猜你喜欢
  • 1970-01-01
  • 2022-11-15
  • 1970-01-01
  • 2013-12-17
  • 2013-06-23
  • 1970-01-01
  • 2021-04-13
  • 2023-04-02
相关资源
最近更新 更多