1. ホーム
  2. python

[解決済み】pythonで「グローバル名が定義されていない」という概念について

2022-02-13 04:36:19

質問

Pythonを勉強中で、このエラーについてのブログも読みましたが、まだはっきりと理解できていません。これは私が書いているコードのスニペットです。

for i in included:
    global signs,accounts, regions
    global sign_name, acc_name, rg_name
    if type == "regions":
        regions = i
        rg_name = regions['data']['region']
    if type == "accounts":
        accounts = i
        acc_name = accounts['data']['account']

    print("Stopping account " + acc_name + " in region " + rg_name)

NameError: グローバル名 'acc_name' が定義されていません。

Python 2.7を使用しています。 Pythonのグローバル名とイニシエーションの概念について理解できる人がいれば、それは素晴らしいことです。 事前にありがとうございます。

どのように解決するのですか?

ご心配なく :) Pythonへようこそ! このエラーは、存在しないグローバル変数を探しているために起こります。 if type == "accounts" という条件です。

を試してみてください。

for i in included:
  global signs,accounts, regions
  global sign_name, acc_name, rg_name
  regions = "no region yet"
  acc_name = "no acc_name yet"
   if type == "regions"
     regions = i
     rg_name = regions['data']['region']
   if type == "accounts"
     accounts = i
     acc_name = accounts['data']['account']

   print("Stopping account " + acc_name + " in region " + rg_name)

これでエラーは解除され、少なくとも他のバグが表示されることはないでしょう :)

また、他の方もおっしゃると思いますが、この文脈でグローバル変数を宣言する理由はありません。 最初は "can't find global variable" と表示されました。 global キーワードでトリガーをかけていなかったので if ステートメントをチェックし、最初に locals() 変数を探し、見つからなかったので globals() 変数が見つからず、キックされてエラーになる。

を削除することができます。 global という変数があれば、このようにうまく動作します。

for i in included:
   regions = "no region yet"
   acc_name = "no acc_name yet"
   if type == "regions"
     regions = i
     rg_name = regions['data']['region']
   if type == "accounts"
     accounts = i
     acc_name = accounts['data']['account']

   print("Stopping account " + acc_name + " in region " + rg_name)

もう一つ簡単な注意点として、決して type を変数として使用します。 type_ の代わりに その理由は typebuiltin Pythonの関数で、もし type を変数として使用すると、誤ってその組み込み名をエイリアスすることになります。

最後に、もう少しスクリプトをすっきりさせるために。

# only use "i" when you're using numbers, otherwise just call it 
# the name of the data you're using :)
for account_data in included:
   regions = "no region yet"
   acc_name = "no acc_name yet"
   if type_ == "regions"
     rg_name = account_data['data']['region']
   if type_ == "accounts"
     acc_name = account_data['data']['account']

   # here's an example of Pythonic string formatting :)
   print("Stopping account {} in region {}".format(acc_name, rg_name))