質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

PyCharm

エディター・開発ツール

Q&A

解決済

2回答

984閲覧

関数の中のグローバル変数を見つけ出す方法

MagMag

総合スコア80

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

PyCharm

エディター・開発ツール

0グッド

3クリップ

投稿2020/05/15 01:59

def文中のグローバル変数を一気に見つける方法はありますでしょうか?

自分で意識してグローバル変数を使うときには大文字にしているのですが、たまにミスでグローバル空間の変数名を関数内で使ってしまうことがあります。今のことろ不具合は発生しないのですが、意図しないグローバル変数はバグになりそうな予感がするので、一気に見つけてつぶす方法があれば、と思いました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

LouiS0616

2020/05/15 07:55

PyCharmの場合、外側のスコープの変数と重複した命名をすると警告を吐いたと思いますが。 実際に被らせてみるとどうなります?
MagMag

2020/06/04 02:26

ありがとうございます!出てきました。ニョロニョロ下線部をきちんと使いこなしていませんでした。遅くなりましたがありがとうございます。
MagMag

2020/06/04 06:11

今気付いたのですが、関数内で命名すると警告を吐きますが、関数内で定義せずにスコープ外の変数を使用してもニョロニョロは出ないですね。そのため、スクリプト内の関数をモジュール化しようとすると、エラーが出てます。他の方の回答の参考にして対応します。
LouiS0616

2020/06/04 11:04

グローバル変数(Pythonではイコールモジュール変数)を関数内から参照することはそんなに忌避されることでも無いので、警告は出ないでしょうね。 import numpy なんてやったらモジュール変数numpyができるわけですし。組み込み関数もグローバル辞書から取り出して使っています。 乱暴なやり方ですけど、関数外のコードをいったんコメントアウトしてしまうのが一番早い気がします。
guest

回答2

0

ベストアンサー

自分で意識してグローバル変数を使うときには大文字にしているのですが、

PEP8: Pythonコードのスタイルガイド」の命名規約では、定数を大文字にすることになっています。
グローバル変数は使うのを避けるか、グローバル変数クラスを定義するといいですよ。

グローバル変数にアクセスしているかどうかは、逆アセンブルしてみるといいです。
Python3.8 であれば、以下のように逆アセンブルして LOAD_GLOBAL を探すといいです。

  • sample.py:

python

1global_variable = 123 2 3def foo(): 4 local_variable = 456 5 print(global_variable, local_variable) 6 7foo()
  • 逆アセンブル:

console

1$ python3.8 -m dis sample.py 2 1 0 LOAD_CONST 0 (123) 3 2 STORE_NAME 0 (global_variable) 4 5 3 4 LOAD_CONST 1 (<code object foo at 0x6fffffc50c90, file "sample.py", line 3>) 6 6 LOAD_CONST 2 ('foo') 7 8 MAKE_FUNCTION 0 8 10 STORE_NAME 1 (foo) 9 10 7 12 LOAD_NAME 1 (foo) 11 14 CALL_FUNCTION 0 12 16 POP_TOP 13 18 LOAD_CONST 3 (None) 14 20 RETURN_VALUE 15 16Disassembly of <code object foo at 0x6fffffc50c90, file "sample.py", line 3>: 17 4 0 LOAD_CONST 1 (456) 18 2 STORE_FAST 0 (local_variable) 19 20 5 4 LOAD_GLOBAL 0 (print) 21 6 LOAD_GLOBAL 1 (global_variable) 22 8 LOAD_FAST 0 (local_variable) 23 10 CALL_FUNCTION 2 24 12 POP_TOP 25 14 LOAD_CONST 0 (None) 26 16 RETURN_VALUE

<code object foo ...> 以降のfoo関数で LOAD_GLOBAL で print と global_variable にアクセスしていることがわかります。

投稿2020/05/15 07:19

編集2020/05/15 07:22
shiracamus

総合スコア5406

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MagMag

2020/06/04 02:27

そういう機能があるのは知りませんでいた。試してみます。ありがとうございました。
MagMag

2020/06/04 02:28

回答が遅くなってすみません。
guest

0

ctrl+fでファイル内検索ができます。
そこに[global]といれて、Find Next というボタンを押せば出てきます。

投稿2020/05/15 02:33

skysoul

総合スコア111

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MagMag

2020/05/15 06:04

ありがとうございます。自分が使っているPyCharmではうまくヒットしないようです(使い方が違っているのかもしれませんが)。
skysoul

2020/05/15 06:22

すいません。CTRL+FがつかえるのはpythonのIDLEというものに該当するようです いったんpcのメモ帳に移して(コピペ)ctrl+wで検索して、修正して、あなたの使っているソフトにメモ帳からコピペすればうまくいくと思います
MagMag

2020/06/04 02:26

遅くなりましたが、ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問