teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

4

誤記

2018/04/29 14:30

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

answer CHANGED
@@ -1,19 +1,20 @@
1
1
  追記:
2
- quiquiさん回答からipythonを知り、インストールして少し使ってみたところ・・・今まで知らずにいて損した気分がだんだん強くなってきました。自分の回答は蛇足だったようです。
2
+ quiquiさん回答からIPythonを知り、インストールして少し使ってみたところ・・・今まで知らずにいて損した気分がだんだん強くなってきました。自分の回答は蛇足だったようです。
3
3
 
4
- (ちなみにiptyonのREPL上で定義した関数fooについて
4
+ (ちなみにIPythonのREPL上で定義した関数fooについて
5
- `foo.__code__.co_filename`を調べるとcpythonでは`<stdin>`であったのに対してiptyonでは`<ipython-input-4-01cc26abac88>`といった名前が入ってます。つまり元の回答で少し書いたlinecacheへのモンキーパッチをipythonはやってくれているということだと思います。)
5
+ `foo.__code__.co_filename`を調べるとCPythonでは`<stdin>`であったのに対してIPythonでは`<ipython-input-4-01cc26abac88>`といった名前が入ってます。つまり元の回答で少し書いたlinecacheへのモンキーパッチをIPythonはやってくれているということだと思います。)
6
6
 
7
7
  以下元の回答
8
8
  ---
9
- cpython前提でのコメントです。
9
+ CPython前提でのコメントです。
10
+ (CPythonはPython言語の最も広く用いられている標準の実装のことです: by Wikipedia)
10
11
 
11
12
  おそらくREPL上で直接定義した関数についてはデフォルトの状態のままでは見ることができないと思います。inspect.getsource()は
12
13
 
13
14
  `関数オブジェクト.__code__.co_filename`
14
15
  `関数オブジェクト.__code__.co_firstlineno`
15
16
 
16
- から元のソースを取り出してそれを表示しているのだと思います。この情報はモジュールをimportする場合など、pythonのコンパイラーがソースファイルをコンパイルしてcodeオブジェクトに変換する際に記録されますがREPLのco_filenameは"<stdin>"などになっており、所謂普通のファイルパスではありません。
17
+ から元のソースを取り出してそれを表示しているのだと思います。この情報はモジュールをimportする場合など、CPythonのコンパイラーがソースファイルをコンパイルしてcodeオブジェクトに変換する際に記録されますがREPLのco_filenameは"<stdin>"などになっており、所謂普通のファイルパスではありません。
17
18
 
18
19
  しかしながらinspect.pyを覗いてみると面白いコメントがありました。
19
20
 
@@ -44,10 +45,10 @@
44
45
  しかし自分はREPLを使う際には別の工夫をします。
45
46
 
46
47
  ###IDLE
47
- こういう目的ならIDLEのREPL+Editorを使うのいいのではないでしょうか。ちょっと変数の中身を見たり関数の動きを試す際にはREPLを、関数を定義してrunとしたい場合はEditorを使うという感じです。
48
+ こういう目的ならIDLEのREPL+Editorを使うのいいのではないでしょうか。ちょっと変数の中身を見たり関数の動きを試す際にはREPLを、関数を定義してrunとしたい場合はEditorを使うという感じです。
48
49
 
49
- ###cpython -i
50
+ ###python -i
50
- IDLEのREPLはインデントがくずれたりとちょっとだけくせがある気がするのでcpythonをターミナル上で起動してREPLとして用いたくなる場合もよくあります。その場合REPL自身のヒストリー機能は活用しますが、関数をREPL上で定義するのはやはり面倒なので別の画面でエディターを起動しておいて普通にソースファイル上に関数を定義します。
51
+ IDLEのREPLはインデントがくずれたりとちょっとだけくせがある気がするのでpython(CPython)をターミナル上で起動してREPLとして用いたくなる場合もよくあります。その場合REPL自身のヒストリー機能は活用しますが、関数をREPL上で定義するのはやはり面倒なので別の画面でエディターを起動しておいて普通にソースファイル上に関数を定義します。
51
52
 
52
53
  少しずつ変更しながら再度importするのがメンドクサイので、
53
54
 
@@ -76,4 +77,4 @@
76
77
  print(f'reloaded {an} {type(av)}')
77
78
  main.py = new_py
78
79
  ```
79
- というようなreload関数を定義しておき、REPL上から`reload()`と打ち込んでしまいます。定義の中身自体はリロードしたモジュール上にある名前を`__main__`モジュールへ上書きするというインチキくさいものなのでcpythonをREPLとして用いるときにしか使いません。
80
+ というようなreload関数を定義しておき、REPL上から`reload()`と打ち込んでしまいます。定義の中身自体はリロードしたモジュール上にある名前を`__main__`モジュールへ上書きするというインチキくさいものなのでCPythonをREPLとして用いるときにしか使いません。

3

誤記

2018/04/29 14:30

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

answer CHANGED
@@ -76,4 +76,4 @@
76
76
  print(f'reloaded {an} {type(av)}')
77
77
  main.py = new_py
78
78
  ```
79
- というようなreload関数を定義しておき、REPL上から`reload()`と打ち込んでしまいます。定義の中身自体はリロードしたモジュール上にある名前を__main__モジュールへ上書きするというインチキくさいものなのでcpythonをREPLとして用いるときにしか使いません。
79
+ というようなreload関数を定義しておき、REPL上から`reload()`と打ち込んでしまいます。定義の中身自体はリロードしたモジュール上にある名前を`__main__`モジュールへ上書きするというインチキくさいものなのでcpythonをREPLとして用いるときにしか使いません。

2

誤記

2018/04/29 14:14

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

answer CHANGED
@@ -15,7 +15,7 @@
15
15
 
16
16
  から元のソースを取り出してそれを表示しているのだと思います。この情報はモジュールをimportする場合など、pythonのコンパイラーがソースファイルをコンパイルしてcodeオブジェクトに変換する際に記録されますがREPLのco_filenameは"<stdin>"などになっており、所謂普通のファイルパスではありません。
17
17
 
18
- しかしながらinspect.pyをいてみると面白いコメントがありました。
18
+ しかしながらinspect.pyをいてみると面白いコメントがありました。
19
19
 
20
20
  ```Python
21
21
  def findsource(object):

1

追記

2018/04/29 14:13

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

answer CHANGED
@@ -1,3 +1,11 @@
1
+ 追記:
2
+ quiquiさん回答からipythonを知り、インストールして少し使ってみたところ・・・今まで知らずにいて損した気分がだんだん強くなってきました。自分の回答は蛇足だったようです。
3
+
4
+ (ちなみにiptyonのREPL上で定義した関数fooについて
5
+ `foo.__code__.co_filename`を調べるとcpythonでは`<stdin>`であったのに対してiptyonでは`<ipython-input-4-01cc26abac88>`といった名前が入ってます。つまり元の回答で少し書いたlinecacheへのモンキーパッチをipythonはやってくれているということだと思います。)
6
+
7
+ 以下元の回答
8
+ ---
1
9
  cpython前提でのコメントです。
2
10
 
3
11
  おそらくREPL上で直接定義した関数についてはデフォルトの状態のままでは見ることができないと思います。inspect.getsource()は