Reputation: 37
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
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
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
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