'Global name not defined' concept in python

隐身守侯 提交于 2021-02-10 03:53:52

问题


I am learning Python and have read blogs about this error, but I am still not able to understand this clearly yet. This is a snippet of the code I am writing:

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: global name 'acc_name' is not defined.

I am using Python 2.7 If anyone can help me understand the concept of global names and initiation in Python, it would be great. Thanks in advance.


回答1:


No worries :) welcome to Python! It's throwing that error because it's looking for a global variable that doesn't exist -- and the reason it doesn't exist is because you're not hitting the if type == "accounts" condition!

try this:

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)

That will clear the error and at least let you see what other bugs may be popping up :)

I'll also point out, as I'm sure you will hear from others, there's no reason for you to be declaring global variables in this context. It was initially saying "can't find global variable" because before you put in the global keywords, it wasn't triggering on the if statement and so first it checked the locals() variables, and not finding it, searched for the globals() variables, and not finding it kicked and error.

You can remove the global variables and it will work fine like so:

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)

Another quick note, never the type as a variable... use type_ instead. The reason is type is a builtin Python function and if you use type as a variable you are accidentally aliasing that builtin name.

Finally, just to clean up the script a little more:

# 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))



回答2:


Before you use the global variable acc_name in your function for reading, it must be first initialized somewhere: either outside of the function or inside it. If type == "accounts", then the variable would be initialized, but if it is not, it wouldn't be.




回答3:


From what I can see is that you never predefine acc_name in both local and global scopes. The error wouldn't exist if you add acc_name = 'something' anywhere before print("Stopping account " + acc_name + " in region " + rg_name).

The error in your code is that if type == "accounts" but the type wasn't 'accounts' so acc_name = accounts['data']['account'] never ran.

Try this:

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']
   else:
       rg_name="No regions" #backup str
   if type == "accounts":
       accounts = i
       acc_name = accounts['data']['account']
   else:
       acc_name="No accounts" #backup str

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

This way there will be no errors

I dont know if that was your code but global command only need to be used inside functions for that it is not necessary to use it elsewhere.

and as a side note, a little more code would be appreciated and type isn't a good variable because it is also a builtin method.



来源:https://stackoverflow.com/questions/41916300/global-name-not-defined-concept-in-python

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!