Quantcast
Channel: プログラミング
Viewing all articles
Browse latest Browse all 8910

Python初心者のお勉強ノート(5)コマンドライン引数の参照と例外処理 - おもこん

$
0
0

コマンドラインには、引数を書くことができます。 例えば、echo.pyというPythonプログラムは引数をそのまま出力します。

> py echo.py abc
abc

このとき、echo.pyの中では、どのようにして引数を得ているのでしょうか?

sysモジュール

引数を知るためには、sysモジュールを使います。 モジュールとは、Pythonの再利用可能なプログラムです。 sysは、はじめから組み込まれているモジュールです。

モジュールを使うときには、importコマンドを使います。

import sys

このコマンドは通常プログラムの最初に記述します。

sysは、引数をargvというリストにします。 このリストにアクセスするときは、sys.argvのように「モジュール名.リスト名」の形を用います。

import sys

print(sys.argv[1])

これが、echoのプログラムです。 sys.arg[1]は1番目の引数を表します。

  • コマンドラインでは、空白で引数を区切る
  • 引数に空白を入れたいときはシングルクォートまたはダブルクォートで囲む

次の例を見てください。

> py echo.py abc def
abc
> py echo.py 'abc def'
abc def
> py echo.py "abc def"
abc def

echo.py は1番目の引数を表示するので、最初の例ではabcのみが出力され、2番目の引数defは現れません。 残りの例ではクォートで囲んだ部分がまとまって1番目の引数になるのでabc defが表示されます。

なおsys.argv[0]は、プログラム名(例えばecho.py)を表します。

型変換

2つの引数が数字で与えられており、プログラムaddはその和を表示します。

> py add.py 10 15
25.0

引数の和を求めるには

sys.arg[1]+sys.arg[2]

で良さそうですが、うまく動きません。 なぜなら、引数は文字列であり、int型やfloat型ではないからです。 文字列から、intまたはfloatへの変換が必要で、そのための関数はint()やfloat()です。 ここでは、float型に直して計算することにしましょう。

import sys

print(float(sys.argv[1])+float(sys.argv[2]))

print文の引数(かっこの中の部分)は複雑ですが、sys.arg[]で取り出した文字列をfloat()関数に渡してfloat型にしています。

エラーと例外処理

ここは、少し難しい話になりますが、プログラミングでは有益な内容です。 先ほどの関数int()やfloat()は引数が変換可能な数字でないとエラーになります。

  • int("2.5") =>文字列2.5は整数にならないのでエラー
  • float("Hello") =>文字列Helloは数字でないのでエラー

add.pyにおいてユーザが数字変換できない文字列を入力した場合、正しい使い方を表示するのが一般的に用いられる方法です。

また、引数が2つ(以上)なければエラーが起きます。 その場合も正しい使い方の表示をするのが良いでしょう。 例えば次のような表示です。

Usage: py add.py <number> <number>

プログラム実行時にエラーが起きた時に、例外処理として対処するのが有効な方法です。 エラー(error)と例外(exception)は異なる概念なのですが、ここでは詳しい説明は省きます。 先ほどのプログラムで、引数に10とHelloを与えたとします。 プログラムは1行目から順次実行し、次の箇所でエラーが起きます。

print(float(sys.argv[1])+float(sys.argv[2]))

2番目の引数Helloを文字列として取り出すところまではOKで、それをfloatに変換するところでエラーになります。 このエラーは例外を発生させプログラムはストップします。

このように、実行時のエラーは例外を発生させるので、その例外をキャッチしてコントロールできれば、様々なエラー対応が可能です。 これを例外処理といいます。

例外処理は2つの部分の組み合わせになります。 まず、例外が発生する可能性のある部分をtry文で表し、例外が発生した場合に実行するプログラムをexcept文で表します。 具体的には、add.pyを次のように修正します。

import sys

try:
  print(float(sys.argv[1])+float(sys.argv[2]))

except:
  print("Usage: py add.py <number> <number>")

try文のスイート(Pythonの文法では、一連の文のかたまりをスイートといいます。C言語の複文Compound statementに相当します)で例外が発生するとexcept節が実行され、その後try文の次に実行が移ります。 上のプログラムではtry文の次はない(excep節は除いて考えます)ので、プログラムは終了します。

例外処理では、もっと複雑なことができるのですが、ここでは最も簡単な例のみに止めておきます。


Viewing all articles
Browse latest Browse all 8910

Latest Images

Trending Articles