Alex Hu
Alex Hu

Reputation: 37

#Python Why do I keep getting namedtuple attribute error for this code?

When I run the code as below, it returns attribute error.

AttributeError: 'Contact' object has no attribute 'find_info'

How should I fix this??

phonebook = {}
Contact = namedtuple('Contact', ['phone', 'email', 'address'])

def add_contact(phonebook):
    name = input()
    phone = input()
    email = input()
    address = input()
    phonebook[name] = Contact(phone, email, address)
    print('Contact {} with phone {}, email {}, and address {} has been added successfully!' .format(name, phonebook[name].phone, phonebook[name].email, phonebook[name].address))
    num = 0
    for i in phonebook.keys():
        if i in phonebook.keys():
            num += 1
    print('You now have', num, 'contact(s) in your phonebook.')
def consult_contact(phonebook):
    find_name = input('What is the name of the contact?\n')
    find_info = input('What information do you need?\n')
    if find_name not in phonebook:
        print('Contact not found!')
    else:
        print(phonebook[find_name].find_info)

if __name__ == "__main__":
    add_contact(phonebook)
    consult_contact(phonebook)



Upvotes: 0

Views: 726

Answers (4)

Sandeep Pandey
Sandeep Pandey

Reputation: 16

In your code the value type of find_info is string.

Upvotes: 0

SimonR
SimonR

Reputation: 1824

You cant use the dot notation to access the tuple's attributes like that. The code ends up looking for a method called 'find_info', which doesn't exist.

You can use :

getattr(phonebook[find_name], find_info)

To get the attribute held by the find_info variable.

Upvotes: 1

S.D.
S.D.

Reputation: 2941

Your problem is that you're treating find_info as an attribute in consult_phonebook.

Try this:

def consult_contact(phonebook):
    find_name = input('What is the name of the contact?\n')
    find_info = input('What information do you need?\n')
    if find_name not in phonebook:
        print('Contact not found!')
    else:
        print(getattr(phonebook[find_name], find_info))

When using getattr(phonebook[find_name], find_info) you're essentially fetching the attribute stored in find_info from your contact.

Upvotes: 2

Alex
Alex

Reputation: 937

You can use getattr(phonebook[find_name], find_info). Or perhaps change your Contact object to be a dictionary so you can use find_info as an index directly. You can look into some kind of "AttrDict" if you want both attribute and variable key access: Accessing dict keys like an attribute?

Upvotes: 1

Related Questions