0

完成新手问题。

我正在开发一个使用 API 搜索电影数据库的类。

以下是在 Python 解释器中使用电影名称和年份进行查询的方法:

import moviesearch

movie_db = moviesearch.MovieSearch()
result = movie_db.search('Clockwork Orange', year='1971')
print result

执行此特定查询会从我正在使用的服务中产生一个结果。

为了节省输入以进行测试,我创建了以下脚本 m.py:

from sys import argv
import moviesearch

script, movie_name, params = argv

movie_db = moviesearch.MovieSearch()
result = movie_db.search(movie_name, params)
print result

当我像这样执行这个脚本时:

python m.py 'Clockwork Orange', year='1971'

该服务产生两个结果。

所以这意味着当我用脚本测试类时,我格式化参数的方式有问题。有人可以告诉我我做错了什么吗?

我不包括用于查询电影数据库的类,因为我认为这对于找出问题所在没有必要。我需要知道的是如何在使用脚本时正确格式化我的参数,以便它完全按照上面示例中的方式执行,我直接从 Python 解释器使用类。

提前感谢您的帮助。

4

1 回答 1

5

当您在 shell 中执行此操作时(我假设 *nix 平台具有与 sh 兼容的 shell;Windows 可能略有不同):

python m.py 'Clockwork Orange', year='1971'

sys.argv列表将是:

['m.py', 'Clockwork Orange,', 'year=1971']

所以,当你这样做时:

script, movie_name, params = argv

您最终movie_name设置为字符串'Clockwork Orange,'(带有额外的逗号),并params设置为字符串'year=1971'。所以,你的电话最终是:

result = movie_db.search('Clockwork Orange,', 'year=1971')

这与以下内容不同:

result = movie_db.search('Clockwork Orange', year='1971')

那么,你如何得到你想要的?

好吧,您可以使用如下代码解析参数:

params = dict(pair.split('=') for pair in argv[2:])
result = movie_db.search(movie_name, **params)

第一行会给你一个dictwith {'year': '1971'}。然后,您可以使用**语法将其dict作为关键字参数转发给函数。

最后,您应该在用于运行脚本的参数中去掉多余的逗号。(您可以编写代码来删除它,但它似乎只是一个错字,所以更好的解决方法是不要打错字。)

于 2012-10-31T21:14:35.020 回答