Nalum
Nalum

Reputation: 4213

Python class variable not updating

I have a class that is taking in an Id and trying to update the variable current_account but when I print out the details of the current_account it hasn't updated.

Anyone got any ideas for this? New to python so might be doing something stupid that I can't see.

class UserData:
    def __init__(self, db_conn=None):
        if None == db_conn:
            raise Exception("DB Connection Required.")

        self.db = db_conn
        self.set_my_account()
        self.set_accounts()
        self.set_current_account()

    def set_current_account(self, account_id=None):
        print account_id
        if None == account_id:
            self.current_account = self.my_account
        else:
            if len(self.accounts) > 0:
                for account in self.accounts:
                    if account['_id'] == account_id:
                        self.current_account = account
                        print self.current_account['_id']
            else:
                raise Exception("No accounts available.")

Assume that set_my_account() gets a dictionary of account data and that set_accounts() get a list of dictionaries of account data.

So when I do the following:

user_data = UserData(db_conn=db_conn)
user_data.set_current_account(account_id=account_id)

Where db_conn is a valid database connection and account_id is a valid account id.

I get the following out of the above two lines.

None
518a310356c02c0756764b4e
512754cfc1f3d16c25c350b7

So the None value is from the declaration of the class and then the next two are from the call to set_current_account(). The first id value is what I'm trying to set. The second id value is what was already set from the class __init__() method.

Upvotes: 1

Views: 7497

Answers (2)

Nalum
Nalum

Reputation: 4213

Figured out what it was.

The data was being changed else where in the code base. It is now working as expected.

Thanks guys for pointing out the Python centric things that I was doing wrong, good to get it.

Upvotes: 1

msw
msw

Reputation: 43527

There were a lot of redundancies an un-Pythonic constructions. I cleaned up the code to help me understand what you trying to do.

class UserData(object):
    def __init__(self, db_conn):
        self.db = db_conn
        self.set_my_account()
        self.set_accounts()
        self.set_current_account()

    def set_current_account(self, account_id=None):
        print account_id
        if account_id is None:
            self.current_account = self.my_account
        else:
            if not self.accounts:
                raise Exception("No accounts available.")

            for account in self.accounts:
                if account['_id'] == account_id:
                   self.current_account = account
                   print self.current_account['_id']

user_data = UserData(db_conn)
user_data.set_current_account(account_id)

You used default arguments (db_conn=None) when a call without an explicit argument is invalid. Yes, you can now call __init__(None) but you could also call __init__('Nalum'); you can't protect against everything.

By moving the "No accounts" exception the block fast-fails and you save one level of indention.

The call UserData(db_conn=db_conn) is valid but unecessarily repetitive.

Unfortunately, I still can't figure out what you are trying to accomplish and this is perhaps the largest flaw. Variable names are terribly important for help the reader (which may be the future you) make sense of code. current_account, my_account, account_id and current_account['_id'] so obscure the intention that you should really consider more distinct, informative names.

Upvotes: 3

Related Questions