[解決済み】外部スコープで定義された名前をシャドウイングする際の問題点とは?
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
.
最後に、組み込み関数と型も同じ名前空間に存在し、同じようにシャドーイングすることができます。
短い関数、適切な命名、適切なユニットテストのカバレッジがあれば、どれも大した問題ではありませんが、まあ、時には完璧ではないコードを維持しなければならないこともあり、そのような可能性のある問題について警告されることは助けになるかもしれません。
関連
-
pythonを使ったオフィス自動化コード例
-
Python関数の高度な応用を解説
-
[解決済み】Pythonスクリプトで「Expected 2D array, got 1D array instead: 」というエラーが発生?
-
[解決済み] Pythonのリストメソッドであるappendとextendの違いは何ですか?
-
[解決済み] オブジェクト名の前のシングルアンダーコアとダブルアンダーコアの意味は何ですか?
-
[解決済み] Python 3 の "python -m SimpleHTTPServer" に相当するものは何ですか?
-
[解決済み] 自分」という言葉は何のためにあるのか?
-
[解決済み] Pythonの変数名や関数名の命名規則について教えてください。
-
[解決済み】__str__と__repr__の違いは何ですか?
-
[解決済み】type()とisinstance()の違いは何ですか?)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
ピローによる動的キャプチャ認識のためのPythonサンプルコード
-
Python百行で韓服サークルの画像クロールを実現する
-
Pythonの@decoratorsについてまとめてみました。
-
[解決済み】RuntimeWarning: invalid value encountered in double_scalars で numpy の除算ができない。
-
[解決済み】TypeErrorの修正方法。Unicodeオブジェクトは、ハッシュ化する前にエンコードする必要がある?
-
[解決済み】Python regex AttributeError: 'NoneType' オブジェクトに 'group' 属性がない。
-
[解決済み】numpyの配列連結。"ValueError:すべての入力配列は同じ次元数でなければならない"
-
[解決済み] 'int'オブジェクトに'__getitem__'属性がない。
-
[解決済み】Python: OverflowError: 数学の範囲エラー
-
[解決済み】ImportError: bs4という名前のモジュールがない(BeautifulSoup)