0

完全な初心者の質問.

API を使用して映画データベースを検索するためのクラスを開発しています。

Python インタープリター内から映画のタイトルと年を使用してクエリを作成する方法を次に示します。

import moviesearch

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

この特定のクエリを実行すると、使用しているサービスから 1 つの結果が得られます。

テスト用の入力を節約するために、次のスクリプト 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'

このサービスは 2 つの結果をもたらします。

したがって、これは、スクリプトでクラスをテストしているときにパラメーターをフォーマットする方法に問題があることを意味します。誰かが私が間違っていることを教えてもらえますか?

何が問題なのかを理解するために必要だとは思わないので、映画データベースを照会するためのクラスは含めていません。私が知る必要があるのは、スクリプトを使用するときにパラメーターを適切にフォーマットして、Python インタープリターからクラスを直接使用している上記の例とまったく同じように実行する方法です。

助けてくれてありがとう。

4

1 に答える 1

5

シェルでこれを行う場合 (sh 互換シェルを備えた *nix プラットフォームを想定しています。Windows はおそらく少し異なります):

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

sys.argvリストは次のとおりです。

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

したがって、これを行うと:

script, movie_name, params = argv

最終的にmovie_nameset to the string 'Clockwork Orange,'(追加のカンマ付き) になり、paramsset to the string になります'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 に答える