回答編集履歴
4
誤記
answer
CHANGED
@@ -1,19 +1,20 @@
|
|
1
1
|
追記:
|
2
|
-
quiquiさん回答から
|
2
|
+
quiquiさん回答からIPythonを知り、インストールして少し使ってみたところ・・・今まで知らずにいて損した気分がだんだん強くなってきました。自分の回答は蛇足だったようです。
|
3
3
|
|
4
|
-
(ちなみに
|
4
|
+
(ちなみにIPythonのREPL上で定義した関数fooについて
|
5
|
-
`foo.__code__.co_filename`を調べると
|
5
|
+
`foo.__code__.co_filename`を調べるとCPythonでは`<stdin>`であったのに対してIPythonでは`<ipython-input-4-01cc26abac88>`といった名前が入ってます。つまり元の回答で少し書いたlinecacheへのモンキーパッチをIPythonはやってくれているということだと思います。)
|
6
6
|
|
7
7
|
以下元の回答
|
8
8
|
---
|
9
|
-
|
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する場合など、
|
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を使うの
|
48
|
+
こういう目的ならIDLEのREPL+Editorを使うのもいいのではないでしょうか。ちょっと変数の中身を見たり関数の動きを試す際にはREPLを、関数を定義してrunとしたい場合はEditorを使うという感じです。
|
48
49
|
|
49
|
-
###
|
50
|
+
###python -i
|
50
|
-
IDLEの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__`モジュールへ上書きするというインチキくさいものなので
|
80
|
+
というようなreload関数を定義しておき、REPL上から`reload()`と打ち込んでしまいます。定義の中身自体はリロードしたモジュール上にある名前を`__main__`モジュールへ上書きするというインチキくさいものなのでCPythonをREPLとして用いるときにしか使いません。
|
3
誤記
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
誤記
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
追記
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()は
|