外部スコープで定義された名前をシャドウイングすると何が問題になるのでしょうか? 質問する

外部スコープで定義された名前をシャドウイングすると何が問題になるのでしょうか? 質問する

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

この検査は、外部スコープで定義されたシャドウ名を検出します。

外部スコープから変数にアクセスするのは悪い習慣だとわかっていますが、外部スコープをシャドウイングすることにはどのような問題があるのでしょうか?

以下は、PyCharm が警告メッセージを表示する例です。

data = [4, 5, 6]

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

print_data(data)

ベストアンサー1

上記のスニペットには大きな問題はありませんが、引数がいくつかあり、コード行がかなり多い関数を想像してください。次に、引数の名前を に変更することにしますdatayadda、関数本体で使用されている場所の 1 つを忘れています... はグローバルを参照するようになり、奇妙な動作が始まります。グローバル名 がなければ、dataがはるかに明白になります。NameErrordata

また、Python ではすべてがオブジェクト (モジュール、クラス、関数を含む) であるため、関数、モジュール、クラスに明確な名前空間がないことも覚えておいてください。別のシナリオとしては、fooモジュールの先頭で function をインポートし、関数本体のどこかでそれを使用する場合が挙げられます。次に、関数に新しい引数を追加し、それに (運が悪いですが) という名前を付けますfoo

最後に、組み込み関数と型も同じ名前空間に存在し、同じ方法でシャドウ化できます。

関数が短く、名前が適切で、単体テストの範囲が適切であれば、これらはいずれもそれほど問題にはなりませんが、完璧とは言えないコードを維持しなければならない場合もあり、そのような潜在的な問題について警告を受けることは役立つかもしれません。

おすすめ記事