完成新手问题。
我正在开发一个使用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解释器中直接使用该类。
提前感谢您的帮助。
答案 0 :(得分:5)
当你在shell中执行此操作时(我假设一个带有sh兼容shell的* nix平台; 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,代码如下:
params = dict(pair.split('=') for pair in argv[2:])
result = movie_db.search(movie_name, **params)
第一行会为您dict
提供{'year': '1971'}
。然后,您可以使用**
语法将dict
转发为函数的关键字参数。
最后,您应该在用于运行脚本的参数中取出额外的逗号。 (您可以编写代码来删除它,但看起来它只是一个错字,所以更好的解决方法是不要输入错误。)