1. ホーム
  2. python

[解決済み】外部スコープで定義された名前をシャドウイングする際の問題点とは?

2022-02-17 18:48:59

質問

PyCharmに切り替えたばかりですが、コードを改善するための警告やヒントを提供してくれることにとても満足しています。ただし、この1つは理解できません。

この検査では、外部スコープで定義された名前のシャドウイングが検出されます。

外部スコープから変数にアクセスするのは良くないことだと思いますが、外部スコープをシャドウイングすることの何が問題なのでしょうか?

PyCharmが警告メッセージを出している例を挙げます。

data = [4, 5, 6]

def print_data(data): # <-- Warning: "Shadows 'data' from outer scope
    print data

print_data(data)

解決するには?

上記のスニペットでは大したことはありませんが、もう少し引数が多く、コード行数もかなり多い関数を想像してみてください。そのとき、あなたは dataが、関数本体で使われている場所の一つを見逃している......。では {コード がグローバルに参照され、奇妙な振る舞いをするようになるのです - もっと明白な {コード {コード グローバル名がない場合 {コード .

また、Pythonではすべてがオブジェクトであり(モジュール、クラス、関数を含む)、関数、モジュール、クラスには個別の名前空間がないことを覚えておいてください。もう1つのシナリオは、関数 yadda をモジュールの先頭で使用し、関数本体のどこかでそれを使用します。そして、関数に新しい引数を追加して、その引数に名前をつけたとします - 不運にも -。 data.

最後に、組み込み関数と型も同じ名前空間に存在し、同じようにシャドーイングすることができます。

短い関数、適切な命名、適切なユニットテストのカバレッジがあれば、どれも大した問題ではありませんが、まあ、時には完璧ではないコードを維持しなければならないこともあり、そのような可能性のある問題について警告されることは助けになるかもしれません。