Weird `inspect.getsource` behavior with generators
まだ誰も着手していません。
- 主要言語
- Python
- スター
- 77.2k
- フォーク
- 35.9k
- PR マージ指標
- PR 指標を取得中
説明
Bug report
Bug description:
If you return two generators (one from a generator function and one a generator expression) from a function and use getsource on each, you get the code for the generator function for both.
def get_2_generators():
def my_generator_1():
for x in range(5):
yield x*2
my_generator_2 = (x*3 for x in range(6))
return my_generator_1(), my_generator_2
g1, g2 = get_2_generators()
getsource(g1.gi_code)
>>>' def my_generator_1():\n for x in range(5):\n yield x*2 \n'
getsource(g2.gi_code)
>>>' def my_generator_1():\n for x in range(5):\n yield x*2 \n'
Further, presumably not a bug but a current limitation, in general using getsource on generator-expression objects returns the code of the function they were created in, rather than the code of the generator expression itself, which can make things confusing when there are multiple such expressions, e.g.:
def get_2_generators():
my_generator_1 = (x*2 for x in range(5))
my_generator_2 = (x*3 for x in range(6))
return my_generator_1, my_generator_2
g1, g2 = get_2_generators()
getsource(g1.gi_code)
>>>'def get_2_generators():\n my_generator_1 = (x*2 for x in range(5)) \n my_generator_2 = (x*3 for x in range(6))\n return my_generator_1, my_generator_2\n'
getsource(g2.gi_code)
>>>'def get_2_generators():\n my_generator_1 = (x*2 for x in range(5)) \n my_generator_2 = (x*3 for x in range(6))\n return my_generator_1, my_generator_2\n'
Can we fix both of the above by making getsource return the code of the generator expression itself?
CPython versions tested on:
3.12
Operating systems tested on:
Windows
Linked PRs
- gh-121933
コントリビューションガイド
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
調査の方向性
まずレポートにある inspect.getsource と generator gi_code の例から始め、次に現在の方向性についてリンクされた PR gh-121933 を確認してください。ジェネレータ関数とジェネレータ式のケースを比較し、完了した作業が無関係な外側のソースを返すのではなく、複数のジェネレータを区別していることを検証してください。
索引モデルが issue の本文から書いたものです。
評価
- 技術スタック
- python
- 領域
- developer-experience
- issue の種類
- バグ
- 難易度
- 5/5
- 見積もり時間
- 1週間以上
- 活発さ
- 停滞
- 明瞭さ
- おおむね明確
- 初心者へのやさしさ
- 25/100