質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

6回答

4096閲覧

他の人が書いたプログラムの読み方・理解の仕方について

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

4グッド

4クリップ

投稿2022/12/03 07:21

プログラミングを勉強しておりますが、
テキスト等で基礎文法を覚えて、テキストのサンプルプログラムを動かしたりしております。
そして、自分なりに、プログラムを拡張したり作りたいアプリがある場合に、色々なサイト
で、似たような機能を実現しようとしているソースを探し、ソースを理解しようとしておりますが、
Web上に公開されている方のソースや、GitHub等のサンプルソースが理解できない状況です。

開発に携わられている方や、プログラミングが趣味・得意・好きという方は、
他の方が書いたプログラムを、最初にどの様に読んで理解しているのでしょうか?

私の場合、例えば、以下のようなソースで
print("Usage: {} modName symName HOSTNAME".format(sys.argv[0]))は、sys.argv[0]は、何かリストに格納しているなぁ。
でも、sys.argv[0]は、どういう情報なんだろう??・・・訳が分からない・・・終了。といった状態です。

特に、リストや辞書等のデーターを格納している箇所については、どういうデーター形式かを事前にしっていないとsys.argv[0]とか
sys.argv[2]とかってわからないと思います。

他の人が書いたプログラムの読み方や理解の仕方等のコツ等をアドバイスいただければと思います。

python

1# snmpget.py 2from pysnmp.hlapi import * 3import sys 4 5if len(sys.argv) != 4: 6 print("Usage: {} modName symName HOSTNAME".format(sys.argv[0])) 7 sys.exit(1) 8 9modName = sys.argv[1] 10if "." in sys.argv[2]: 11 symName, value = sys.argv[2].split('.') 12else: 13 symName = sys.argv[2] 14 value = 0 15router_ip = sys.argv[3] 16 17errorIndication, errorStatus, errorIndex, varBinds = next( 18 getCmd(SnmpEngine(), 19 CommunityData('public'), 20 UdpTransportTarget((router_ip, 161)), 21 ContextData(), 22 ObjectType(ObjectIdentity(modName, symName, value))) 23) 24 25if errorIndication: 26 print(errorIndication) 27elif errorStatus: 28 print('%s at %s' % (errorStatus.prettyPrint(), 29 errorIndex and varBinds[int(errorIndex) - 1][0] or '?')) 30else: 31 for varBind in varBinds: 32 print(' = '.join([x.prettyPrint() for x in varBind]))
signon👍を押しています
uky, melian😍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

melian

2022/12/03 07:45

Python には self documentation system が内蔵されています。例に挙げられている sys.argv に関して言えば、Python を interactive mode で起動して、help 関数を利用して必要な情報を得ることができます。 >>> import sys >>> help(sys)   : argv -- command line arguments; argv[0] is the script pathname if known   :
meg_

2022/12/03 08:43

コードの引用元を明記されるべきかと思います。
dameo

2022/12/03 10:01

人間分かっていることだけしかできません。まず分からないことがあるうちはまともにコードは読めない気がします。 個人的には読んで書いて経験値を増やしていくうちに、まだ読んでない部分のコードを想像しながら読むと思うので、例えば最初の部分でsys.argvとか出てきたら、「ああ、パラメータをパースするんだなぁ」とか、「じゃあ近くにmainがあるんだろうなぁ」(実際にはない)とか、そんな予想をしながら読んで、次にその予想を当てることでコード全体像(設計)を思い浮かべるわけです。モヤモヤした全体像を、予想の当たり外れで修正していき、さらに精度を上げて読んでいく感じです。ディレクトリの構成やビルドの仕組み、関数や変数の名前などから分かるときもありますし、テストコードから読んでいくことで使い方を先に掴むこともあると思います。ようは経験により培われたパターンからの類推を行い、コードから読み取れる以上の情報を想像しながら読んでいるということです。 読みたいところを素早く見つけられるようになれば、理解速度は劇的に早まると思います。逆にそういうパターンから外れてるコードは、誤解を生みやすいとも言えます。
guest

回答6

0

まずは、pythonの文法をちゃんと把握することが必要と思います。
たとえば、基本的なデータ構造、数値・文字列・リスト・辞書 について、値の追加や参照などの操作の理解は必須です。また、オブジェクトに「. (ドット)」を付けてそのクラス/モジュールのメンバにアクセスしているということの理解も必要ですね。
そのほかいろいろ基本的なところを踏まえた上で、順に読んでいけば、それほど難しくはないと思います。

また、プログラムというのは、何かを実現するためにあるので、その領域の知識が無いと文法としてわかったとしても何をしているのかわからないかもしれません。 会計のプログラムであれば会計の知識、質問のプログラムであればSNMPの知識がないと何のことかわからないでしょう。

sys.argv[0]は、何かリストに格納しているなぁ。でも、sys.argv[0]は、どういう情報なんだろう??・・・訳が分からない

とありますが残念ですね。
pythonのソースコードでは、変数は基本的に突然現われたりしません。 今回の 「sys」についても、それより前を見れば、かならずどこかにそれが定義されています。
提示のソースコードでは、「import sys」がそれです。 importされているということは、モジュールだということですね。「python sys」で検索してみましょう。 最初に本家のドキュメントがみつかりました。
https://docs.python.org/ja/3/library/sys.html

このモジュールでは、インタプリタで使用・管理している変数や、インタプリタの動作に深く関連する関数を定義しています。このモジュールは常に利用可能です。

のように書いてあります。 探すと、 argv についても書いてありますね。

Pythonスクリプトに渡されたコマンドライン引数のリスト。

でした。

ちなみに、提示のソースコードはよくない例の一つですね。
from pysnmp.hlapi import *
とあります。 これは、 sysnmpモジュールのhlapiに含まれるものすべてこのソースで使えるようにするということですが、これではhlapiに何が入っているのか全部調べないと追い掛けられません。python界隈では、「import *」はすべきではないとされています。
たぶん「next」、「getCmd」、「CommunityData」などは、定義されていないので、hlapiに含まれるものなのでしょう。 このコードは「import *」が1つですが、複数あったらどこにあるのかまったくわかりませんね。

投稿2022/12/03 08:14

編集2022/12/06 00:59
TakaiY

総合スコア12769

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

最近流行っている AI の ChatGPT 先生に聞いてみました。
(半分ネタですが、それなりに回答してくれるので学習のとっかかりなど、参考になることも多いと思います。)

■ 質問内容
Pythonでsys.argv[0]には何の情報が入っていますか?

■ 回答内容
Pythonでsys.argvとは、Pythonスクリプトが実行されたときにコマンドラインから渡される引数のリストを表します。sys.argv[0]には、Pythonスクリプト自身のファイル名が入っています。例えば、以下のようなPythonスクリプトがあるとします。

python

1import sys 2 3print(sys.argv[0])

このスクリプトを、python script.pyのように実行すると、次のように出力されます。

script.py

sys.argv[0]は、Pythonスクリプトを実行する際に指定したファイル名になります。ただし、sys.argv[0]は、Pythonスクリプトの名前だけではなく、そのスクリプトが保存されているフルパスも含まれます。たとえば、/home/user/scripts/script.pyというフルパスで保存されている場合、sys.argv[0]にはそのフルパスが含まれます。

sys.argv[0]は、Pythonスクリプト自身の名前やフルパスを取得するために使用されることが多いです。しかし、その他にも、sys.argvを使って、Pythonスクリプトを実行する際に渡される複数の引数を取得することもできます。例えば、次のようなPythonスクリプトを考えます。

python

1import sys 2 3# sys.argv[0]はPythonスクリプト自身のファイル名 4print(sys.argv[0]) 5 6# sys.argv[1]は1番目の引数 7print(sys.argv[1]) 8 9# sys.argv[2]は2番目の引数 10print(sys.argv[2])

このスクリプトを、python script.py foo barのように実行すると、次のように出力されます。

script.py foo bar

sys.argv[1]とsys.argv[2]には、Pythonスクリプトを実行する際に渡された1番目と2番目の引数

以上が、sys.argv[0]についての説明です。sys.argv[0]は、Pythonスクリプト自身の名前やフルパスを取得するために使用されることが多いです。また、sys.argvを使って、Pythonスクリプトを実行する際に渡される複数の引数を取得することもできます。

投稿2022/12/03 16:20

編集2022/12/03 16:21
cx20

総合スコア4633

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

そもそも基本的にプログラムや関数(メソッド)などは、望んでいる入力があります。

print("Usage: {} modName symName HOSTNAME".format(sys.argv[0]))は、sys.argv[0]は、何かリストに格納しているなぁ。

これは、正しい値を入力していない使用者に対して、
プログラム名に続いて空白を入れてmodNameを書いて、さらに空白を入れて次にsymName、
最後にHOSTNAMEを書いて実行してくださいとメッセージを出してユーザーに指示しているのです。
このプログラムのargv[1]にはmodName,argv[2]にはsymName,argv[3]にはHOSTNAMEが
入れられているという前提で正常に動作するのです。

まずは、{入力}何を受け取って{出力}何を返すのかを把握するのが大事だと思います。
親切な作成者ならドキュメント等ではっきり記載している方もいると思います。
プログラムの把握が難しいなら、コメント等を多めに残している人を参考にするのもよいです。
全体で何をしているのか把握してから細かい処理を追っていく方が理解しやすいと思います。

投稿2022/12/08 08:51

red_snow

総合スコア19

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

キーワードでネット検索。
改変して結果を見る。
などします。

投稿2022/12/06 01:30

masakifukuta

総合スコア58

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

でも、sys.argv[0]は、どういう情報なんだろう??・・・訳が分からない・・・終了。といった状態です。

分からないから終了ではなく、分からないからこそ調べましょう。調べるときは公式ドキュメントをまず読みましょう。
自力で調べても分からないときは本サイトなどで質問すれば良いです。
公式ドキュメントなどの解説を読んだ上で、自身で色々試して理解していくものかと思います。

投稿2022/12/03 08:40

meg_

総合スコア10580

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

自分で実際にプログラムを動かして値を出力して確認することが多いです

投稿2022/12/03 09:57

yuma.inaura

総合スコア1453

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問