bpr
bpr

Reputation: 477

How to change a global variable in python?

I am accessing data from different accounts from an online platform over their API. I have created a class called Account that holds all the information necessary to access this API. I want to be able to set the account (and the necessary info to gain access) each time before I make an API request. I tried to make a function that will set a global variable Acct to the proper account class instance but after I call choose_account(), Acct continues to return '', is there a better way to handle this type of procedure?

Acct = ''
def choose_account():
    global Acct
    get = raw_input(r'Adap1, Adap2, Adap3, or Adap4? ')
    if get == 'Adap1':
        Acct = Adap1
    elif get == 'Adap2':
        Acct = Adap2
    elif get == 'Adap3':
        Acct = Adap3
    elif get == 'Adap4':
        Acct = Adap4
    else:
        print ("Please type Adap1, Adap2, Adap3, or Adap4 ")

Edit: show Account and Adap1 etc

class Account():

    def __init__(self, name, username, password, org_id):
        self.name = name
        self.username = username
        self.password = password
        self.org_id = org_id

    def update_pw(self, pw):
        self.password = pw 

Adap1 = Account('Adap1', 'username', 'password', 'org_id')

Upvotes: 2

Views: 102

Answers (1)

holdenweb
holdenweb

Reputation: 37153

Sorry, but use of global variables in that way is not usually a good way to go. You are probably new to programming, so I don't want you to feel you are being "told off", but it would be much more sensible to have the function return a value, and then set the global variable with a statement like

Acct = choose_account()

In which case your function ought to look more like this (untested code):

def choose_acct():
    while True:
        get = raw_input(r'Adap1, Adap2, Adap3, or Adap4? ')
        if get == "Adap1":
            return Adap1
        elif get == "Adap2":
            return Adap2
        elif get == "Adap3":
            return Adap3
        elif get == "Adap4":
            return Adap4

Better still, you could consider a data-driven approach to the problem, and define a dictionary like

adict = {"Adap1": Adap1, "Adap2": Adap2, "Adap3": Adap3, "Adap4": Adap4}

Then your function could read (again, untested)

def choose_acct():
    while True:
        get = raw_input(r'Adap1, Adap2, Adap3, or Adap4? ')
        result = adict.get(get, None)
        if result:
            return result

As your experience level grows you will start to recognise the difference between good and bad code, but you made a pretty good attempt.

Upvotes: 4

Related Questions