【Python】SimplePrograms line 8 コマンドライン引数と例外
8行プログラムです。
# This program adds up integers that have been passed as arguments in the command line
import sys
try:
total = sum(int(arg) for arg in sys.argv[1:])
print ('sum =', total)
except ValueError:
print ('Please supply integer arguments')
こちらが実行結果。
$ python l7.py
sum = 0
$ python l7.py 1 2 3
sum = 6
$ python l7.py a
Please supply integer arguments
$
8行と言っても、折り返して2行になったコメント行を含むので、実際のステップ数は6行。
1行目と2行目のコメントはスキップして、3行目から。
import sys
「sys」をインポートします。
コマンドラインの引数は、この「sys」からアクセスします。
try:
【A】
except ValueError:
【B】
4行目と7行目はセットですね。
「try」は、そのブロック内で例外が発生すると拾ってくれます。
拾うのは「except」。
【A】で例外が発生すると、
【B】に飛びます。
何を置いても、飛びます。
今回の場合、【A】には2行あります。
total = sum(int(arg) for arg in sys.argv[1:])
print ('sum =', total)
1行目の「total」の行で例外が発生すると、
2行目の「print」は実行されずに
「except」に飛びます。
これだけだと「goto」文に毛が生えたような感じでしかないだけど、例外はもっと便利な用途もあります。
例外は、別に書こうかな。
5行目。
total = sum(int(arg) for arg in sys.argv[1:])
これはまた、いっぱい詰め込んじゃいましたね。
というか、この
(int(arg) for arg in sys.argv[1:])
という書き方は Python 特有なのですが、どうやら避けては通れないようです。なんと言っても C で書かれているらしいので、処理速度が速くなる由。
ただ、これも長くなるので後日。
ここでやっていることは
引数を1つずつ文字列から数値に変換して
全部足す
ということ。
あとはもうprint文しか残ってないな。
ああ!
コマンドライン引数!
sys.argv[1:]
コマンドライン引数はこの部分ですね。
これだけを表示してみると、こんな感じ。
$ cat arg.py
import sys
print(sys.argv[1:])
$ python arg.py a b c de
['a', 'b', 'c', 'de']
$
ちなみに [1:] は「リストの [1] 以降」という意味です。
これを取ってしまうと、こうなる。
$ !cat
cat arg.py
import sys
print(sys.argv)
$ !py
python arg.py a b c de
['arg.py', 'a', 'b', 'c', 'de']
$
そう。
sys.argv[0] = コマンド
sys.argv[1] = 第1引数
sys.argv[2] = 第2引数
:
となります。
「argv」にはコマンドそのものも含みます。
これは C と同じです。