Python KeyError Exceptions and How to Handle Them – Real Python (2023)

Table of Contents

  • What a Python KeyError Usually Means
  • Where Else You Might See a Python KeyError in the Standard Library
  • When You Need to Raise a Python KeyError in Your Own Code
  • How to Handle a Python KeyError When You See It
    • The Usual Solution: .get()
    • The Rare Solution: Checking for Keys
    • The General Solution: try except
  • Conclusion

Remove ads

Watch Now This tutorial has a related video course created by the Real Python team. Watch it together with the written tutorial to deepen your understanding: Python KeyError Exceptions and How to Handle Them

Python’s KeyError exception is a common exception encountered by beginners. Knowing why a KeyError can be raised and some solutions to prevent it from stopping your program are essential steps to improving as a Python programmer.

By the end of this tutorial, you’ll know:

  • What a Python KeyError usually means
  • Where else you might see a KeyError in the standard library
  • How to handle a KeyError when you see it

Free Bonus: Click here to get our free Python Cheat Sheet that shows you the basics of Python 3, like working with data types, dictionaries, lists, and Python functions.

What a Python KeyError Usually Means

A Python KeyError exception is what is raised when you try to access a key that isn’t in a dictionary (dict).

Python’s official documentation says that the KeyError is raised when a mapping key is accessed and isn’t found in the mapping. A mapping is a data structure that maps one set of values to another. The most common mapping in Python is the dictionary.

The Python KeyError is a type of LookupError exception and denotes that there was an issue retrieving the key you were looking for. When you see a KeyError, the semantic meaning is that the key being looked for could not be found.

In the example below, you can see a dictionary (ages) defined with the ages of three people. When you try to access a key that is not in the dictionary, a KeyError is raised:

(Video) Fixing KeyError Exceptions in Python

>>>

>>> ages = {'Jim': 30, 'Pam': 28, 'Kevin': 33}>>> ages['Michael']Traceback (most recent call last): File "<stdin>", line 1, in <module>KeyError: 'Michael'

Here, attempting to access the key 'Michael' in the ages dictionary results in a KeyError being raised. At the bottom of the traceback, you get the relevant information:

  • The fact that a KeyError was raised
  • The key that couldn’t be found, which was 'Michael'

The second-to-last line tells you which line raised the exception. This information is more helpful when you execute Python code from a file.

Note: When an exception is raised in Python, it is done with a traceback. The traceback gives you all the relevant information to be able to determine why the exception was raised and what caused it.

Learning how to read a Python traceback and understanding what it is telling you is crucial to improving as a Python programmer. To learn more on Python tracebacks, check out Understanding the Python Traceback

In the program below, you can see the ages dictionary defined again. This time, you will be prompted to provide the name of the person to retrieve the age for:

 1# ages.py 2 3ages = {'Jim': 30, 'Pam': 28, 'Kevin': 33} 4person = input('Get age for: ') 5print(f'{person} is {ages[person]} years old.')

This code will take the name that you provide at the prompt and attempt to retrieve the age for that person. Whatever you type in at the prompt will be used as the key to the ages dictionary, on line 4.

Repeating the failed example from above, we get another traceback, this time with information about the line in the file that the KeyError is raised from:

$ python ages.pyGet age for: MichaelTraceback (most recent call last):File "ages.py", line 4, in <module> print(f'{person} is {ages[person]} years old.')KeyError: 'Michael'

The program fails when you give a key that is not in the dictionary. Here, the traceback’s last few lines point to the problem. File "ages.py", line 4, in <module> tells you which line of which file raised the resulting KeyError exception. Then you are shown that line. Finally, the KeyError exception provides the missing key.

So you can see that the KeyError traceback’s final line doesn’t give you enough information on its own, but the lines before it can get you a lot closer to understanding what went wrong.

Note: Like the example above, most of the other examples in this tutorial make use of f-strings, which were introduced in Python 3.6.

(Video) Digging into PyScript & Preventing or Handling Python Errors | Real Python Podcast #115

Remove ads

Where Else You Might See a Python KeyError in the Standard Library

The large majority of the time, a Python KeyError is raised because a key is not found in a dictionary or a dictionary subclass (such as os.environ).

In rare cases, you may also see it raised in other places in Python’s Standard Library, such as in the zipfile module, if an item is not found in a ZIP archive. However, these places keep the same semantic meaning of the Python KeyError, which is not finding the key requested.

In the following example, you can see using the zipfile.ZipFile class to extract information about a ZIP archive using .getinfo():

>>>

>>> from zipfile import ZipFile>>> zip_file = ZipFile('the_zip_file.zip')>>> zip_file.getinfo('something')Traceback (most recent call last):File "<stdin>", line 1, in <module>File "/path/to/python/installation/zipfile.py", line 1304, in getinfo 'There is no item named %r in the archive' % name)KeyError: "There is no item named 'something' in the archive"

This doesn’t really look like a dictionary key lookup. Instead, it is a call to zipfile.ZipFile.getinfo() that raises the exception.

The traceback also looks a little different with a little more information given than just the missing key: KeyError: "There is no item named 'something' in the archive".

The final thing to note here is that the line that raised the KeyError isn’t in your code. It is in the zipfile code, but previous lines of the traceback indicate which lines in your code caused the problem.

When You Need to Raise a Python KeyError in Your Own Code

There may be times when it makes sense for you to raise a Python KeyError exception in your own code. This can be done by using the raise keyword and calling the KeyError exception:

raise KeyError(message)

Usually, the message would be the missing key. However, as in the case of the zipfile package, you could opt to give a bit more information to help the next developer better understand what went wrong.

If you decide to raise a Python KeyError in your own code, just make sure that your use case matches the semantic meaning behind the exception. It should denote that the key being looked for could not be found.

How to Handle a Python KeyError When You See It

When you encounter a KeyError, there are a few standard ways to handle it. Depending on your use case, some of these solutions might be better than others. The ultimate goal is to stop unexpected KeyError exceptions from being raised.

(Video) Intro to Python exceptions

The Usual Solution: .get()

If the KeyError is raised from a failed dictionary key lookup in your own code, you can use .get() to return either the value found at the specified key or a default value.

Much like the age retrieval example from before, the following example shows a better way to get the age from the dictionary using the key provided at the prompt:

 1# ages.py 2 3ages = {'Jim': 30, 'Pam': 28, 'Kevin': 33} 4person = input('Get age for: ') 5age = ages.get(person) 6 7if age: 8 print(f'{person} is {age} years old.') 9else:10 print(f"{person}'s age is unknown.")

Here, line 5 shows how you can get the age value from ages using .get(). This will result in the age variable having the age value found in the dictionary for the key provided or a default value, None in this case.

This time, you will not get a KeyError exception raised because of the use of the safer .get() method to get the age rather than attempting to access the key directly:

$ python ages.pyGet age for: MichaelMichael's age is unknown.

In the example execution above, the KeyError is no longer raised when a bad key is provided. The key 'Michael' is not found in the dictionary, but by using .get(), we get a None returned rather than a raised KeyError.

The age variable will either have the person’s age found in the dictionary or the default value (None by default). You can also specify a different default value in the .get() call by passing a second argument.

This is line 5 from the example above with a different default age specified using .get():

age = ages.get(person, 0)

Here, instead of 'Michael' returning None, it would return 0 because the key isn’t found, and the default value to return is now 0.

The Rare Solution: Checking for Keys

There are times when you need to determine the existence of a key in a dictionary. In these cases, using .get() might not give you the correct information. Getting a None returned from a call to .get() could mean that the key wasn’t found or that the value found at the key in the dictionary is actually None.

With a dictionary or dictionary-like object, you can use the in operator to determine whether a key is in the mapping. This operator will return a Boolean (True or False) value indicating whether the key is found in the dictionary.

(Video) Exploring the New Features of Python 3.11 | Real Python Podcast #131

In this example, you are getting a response dictionary from calling an API. This response might have an error key value defined in the response, which would indicate that the response is in an error state:

 1# parse_api_response.py 2... 3# Assuming you got a `response` from calling an API that might 4# have an error key in the `response` if something went wrong 5 6if 'error' in response: 7 ... # Parse the error state 8else: 9 ... # Parse the success state

Here, there is a difference in checking to see if the error key exists in the response and getting a default value from the key. This is a rare case where what you are actually looking for is if the key is in the dictionary and not what the value at that key is.

The General Solution: try except

As with any exception, you can always use the try except block to isolate the potential exception-raising code and provide a backup solution.

You can use the try except block in a similar example as before, but this time providing a default message to be printed should a KeyError be raised in the normal case:

 1# ages.py 2 3ages = {'Jim': 30, 'Pam': 28, 'Kevin': 33} 4person = input('Get age for: ') 5 6try: 7 print(f'{person} is {ages[person]} years old.') 8except KeyError: 9 print(f"{person}'s age is unknown.")

Here, you can see the normal case in the try block of printing the person’s name and age. The backup case is in the except block, where if a KeyError is raised in the normal case, then the backup case is to print a different message.

The try except block solution is also a great solution for other places that might not support .get() or the in operator. It is also the best solution if the KeyError is being raised from another person’s code.

Here is an example using the zipfile package again. This time, the try except block gives us a way to stop the KeyError exception from stopping the program:

>>>

>>> from zipfile import ZipFile>>> zip = ZipFile('the_zip_file.zip')>>> try:...  zip.getinfo('something')... except KeyError:...  print('Can not find "something"')...Can not find "something"

Since the ZipFile class does not provide .get(), like the dictionary does, you need to use the try except solution. In this example, you don’t have to know ahead of time what values are valid to pass to .getinfo().

Conclusion

You now know some common places where Python’s KeyError exception could be raised and some great solutions you could use to prevent them from stopping your program.

Now, the next time you see a KeyError raised, you will know that it is probably just a bad dictionary key lookup. You will also be able to find all the information you need to determine where the error is coming from by looking at the last few lines of the traceback.

If the problem is a dictionary key lookup in your own code, then you can switch from accessing the key directly on the dictionary to using the safer .get() method with a default return value. If the problem isn’t coming from your own code, then using the try except block is your best bet for controlling your code’s flow.

(Video) Understanding the defaultdict Type in Python

Exceptions don’t have to be scary. Once you know how to understand the information provided to you in their tracebacks and the root cause of the exception, then you can use these solutions to make your programs flow more predictably.

Watch Now This tutorial has a related video course created by the Real Python team. Watch it together with the written tutorial to deepen your understanding: Python KeyError Exceptions and How to Handle Them

FAQs

How does Python handle KeyError exceptions? ›

The Usual Solution: .get() If the KeyError is raised from a failed dictionary key lookup in your own code, you can use .get() to return either the value found at the specified key or a default value.

How do I bypass KeyError in Python? ›

We can avoid KeyError by using get() function to access the key value. If the key is missing, None is returned. We can also specify a default value to return when the key is missing.

How do you raise the KeyError exception in Python? ›

A Python KeyError is raised when you try to access an item in a dictionary that does not exist. You can fix this error by modifying your program to select an item from a dictionary that does exist. Or you can handle this error by checking if a key exists first.

How do you get a value from a dictionary in a way that doesn't raise an exception for missing keys? ›

To avoid getting an exception with undefined keys, we can use the method dict. get(key[, default]). This method returns the value for key if key is in the dictionary, else returns default. If default is not provided, it returns None (but never raises an exception).

What are the 3 specific keywords used in exception handling? ›

The exception handling fundamentals in Java revolve around the five keywords- try, catch, finally, throw, and throws. These keywords form the base of exception handling. All the exception handling mechanisms in Java are a result of these five keywords.

What two keywords would you use for handling exceptions? ›

The "finally" block is used to execute the necessary code of the program. It is executed whether an exception is handled or not. The "throw" keyword is used to throw an exception. The "throws" keyword is used to declare exceptions.

How do I convert an exception to a string in Python? ›

The except statement has been used here to get the exception error in variable “e”. The exception will be converted into a string i.e., str, and saved into the variable “string”. The string variable will be printed out in the shell at the end. Save the updated Python code with the Ctrl+S shortcut.

How do you check if a key exists in a dictionary Python? ›

Check If Key Exists Using has_key()

The has_key() method is a built-in method in Python that returns true if the dict contains the given key, and returns false if it isn't.

What does KeyError mean Python? ›

Now let us see what a key error is. KeyError in Python is raised when you attempt to access a key that is not in a dictionary. The mapping logic is a data structure that maps one set of data to significant others. Hence, it is an error, which is raised when the mapping is accessed and not found.

How do you handle a raised exception? ›

In Python, exceptions can be handled using a try statement. The critical operation which can raise an exception is placed inside the try clause. The code that handles the exceptions is written in the except clause.

How do I manually raise an exception? ›

Throwing exceptions manually

To throw an exception explicitly you need to instantiate the class of it and throw its object using the throw keyword.

How do you solve the KeyError in pandas? ›

How to Fix the KeyError? We can simply fix the error by correcting the spelling of the key. If we are not sure about the spelling we can simply print the list of all column names and crosscheck.

How do you grab a value from a dictionary? ›

You can use the get() method of the dictionary ( dict ) to get any default value without an error if the key does not exist. Specify the key as the first argument. The corresponding value is returned if the key exists, and None is returned if the key does not exist.

How do you validate a key and value in a dictionary? ›

To check if a key-value pair exists in a dictionary, i.e., if a dictionary has/contains a pair, use the in operator and the items() method. Specify a tuple (key, value) . Use not in to check if a pair does not exist in a dictionary.

How do I fetch a specific value from a dictionary? ›

Method 1 : Using List. Step 1: Convert dictionary keys and values into lists. Step 2: Find the matching index from value list. Step 3: Use the index to find the appropriate key from key list.

Which is the most useful method in exception handling? ›

Throwable is the superclass of all exceptions and errors. You can use it in a catch clause, but you should never do it! If you use Throwable in a catch clause, it will not only catch all exceptions; it will also catch all errors.

What are the 3 major exception types in Python? ›

There are mainly three kinds of distinguishable errors in Python: syntax errors, exceptions and logical errors.

What are the 3 types of exceptions? ›

There are three types of exception—the checked exception, the error and the runtime exception.

Which exceptions must be handled? ›

A checked exception must be handled either by re-throwing or with a try catch block, a runtime isn't required to be handled. An unchecked exception is a programming error and are fatal, whereas a checked exception is an exception condition within your codes logic and can be recovered or retried from.

What are the four steps of exception handling? ›

  1. try block. The code which can throw any exception is kept inside(or enclosed in) a try block. ...
  2. catch block. catch block is intended to catch the error and handle the exception condition. ...
  3. throw statement. ...
  4. Understanding Need of Exception Handling. ...
  5. Using try , catch and throw Statement. ...
  6. Using Multiple catch blocks.

What are the four exception handling keywords? ›

C# exception handling is built upon four keywords: try, catch, finally, and throw.

How many types of exceptions are there in Python? ›

Python Built-in Exceptions
ExceptionCause of Error
EOFErrorRaised when the input() function hits end-of-file condition.
FloatingPointErrorRaised when a floating point operation fails.
GeneratorExitRaise when a generator's close() method is called.
ImportErrorRaised when the imported module is not found.
26 more rows

How do I get a list of exceptions in Python? ›

Try and Except Statement – Catching all Exceptions

Try and except statements are used to catch and handle exceptions in Python. Statements that can raise exceptions are kept inside the try clause and the statements that handle the exception are written inside except clause.

What is exception and exception handling with example? ›

Exception handling is the process of responding to unwanted or unexpected events when a computer program runs. Exception handling deals with these events to avoid the program or system crashing, and without this process, exceptions would disrupt the normal operation of a program.

How do you check if a key exists in an object? ›

There are mainly two methods to check the existence of a key in JavaScript Object. The first one is using “in operator” and the second one is using “hasOwnProperty() method”. Method 1: Using 'in' operator: The in operator returns a boolean value if the specified property is in the object.

How do you check if key already exists in an object? ›

You can use the JavaScript in operator to check if a specified property/key exists in an object. It has a straightforward syntax and returns true if the specified property/key exists in the specified object or its prototype chain. Note: The value before the in keyword should be of type string or symbol .

How do I check if an item exists in Python? ›

We can use the in-built python List method, count(), to check if the passed element exists in the List. If the passed element exists in the List, the count() method will show the number of times it occurs in the entire list. If it is a non-zero positive number, it means an element exists in the List.

How do I fix KeyError in Python? ›

How to Fix KeyError in Python. To avoid the KeyError in Python, keys in a dictionary should be checked before using them to retrieve items. This will help ensure that the key exists in the dictionary and is only used if it does, thereby avoiding the KeyError . This can be done using the in keyword.

Is a KeyError a runtime error? ›

In this article, we will handle Key error, which is an example of a runtime error; the syntax of the code can be working correctly, but during program execution, the program cannot handle it due to a run time error of a key error.

What does KeyError 3 mean in Python? ›

The Python "KeyError: 3" exception is caused when we try to access a 3 key in a dictionary that doesn't contain the key. To solve the error, set the key in the dictionary before trying to access it or conditionally set it if it doesn't exist.

What is an exception and how is it handled? ›

An exception (or exceptional event) is a problem that arises during the execution of a program. When an Exception occurs the normal flow of the program is disrupted and the program/Application terminates abnormally, which is not recommended, therefore, these exceptions are to be handled.

What happens when an exception is raised Python? ›

When an exception is raised, no further statements in the current block of code are executed. Unless the exception is handled (described below), the interpreter will return directly to the interactive read-eval-print loop, or terminate entirely if Python was started with a file argument.

How do I fix this exception? ›

How to Fix System Service Exception in Windows [14 Methods]
  1. Method 1: Update System.
  2. Method 2: Update Driver.
  3. Method 3: Run SFC.
  4. Method 4: Disable Antivirus.
  5. Method 5: Check the Hard Drive.
  6. Method 6: Run Antivirus Scan.
  7. Method 7: Run chkdsk.
  8. Method 8: Disable Your Webcam.
25 Oct 2022

Which keyword is used to raise an exception manually? ›

An exception can be raised manually by using the throw keyword. Any type of exceptions which is derived from Exception class can be raised using the throw keyword.

How do I fix KeyError 0 Python with a dictionary? ›

The Python "KeyError: 0" exception is caused when we try to access a 0 key in a dictionary that doesn't contain the key. To solve the error, set the key in the dictionary before trying to access it or conditionally set it if it doesn't exist.

How do you reset the index of a data frame? ›

Use DataFrame.reset_index() function

reset_index() to reset the index of the updated DataFrame. By default, it adds the current row index as a new column called 'index' in DataFrame, and it will create a new row index as a range of numbers starting at 0.

How do I reindex a data frame? ›

Reindexing the columns using axis keyword

One can reindex a single column or multiple columns by using reindex() method and by specifying the axis we want to reindex.

How can I extract all values from a dictionary in Python? ›

Here are 3 approaches to extract dictionary values as a list in Python:
  1. (1) Using a list() function: my_list = list(my_dict.values())
  2. (2) Using a List Comprehension: my_list = [i for i in my_dict.values()]
  3. (3) Using For Loop: my_list = [] for i in my_dict.values(): my_list.append(i)
25 Feb 2022

What is get () in Python? ›

The get() method returns the value of the item with the specified key.

Can a dictionary have a key without a value? ›

There is no such thing as a key without a value in a dict. You can just set the value to None, though.

Can two keys have same value in dictionary? ›

No, each key in a dictionary should be unique. You can't have two keys with the same value.

How do you check if a value matches a key in Python? ›

Checking if key exists using the get() method

The get() method is a dictionary method that returns the value of the associated key. If the key is not present it returns either a default value (if passed) or it returns None. Using this method we can pass a key and check if a key exists in the python dictionary.

How do you check if a value exists in a list of dictionary Python? ›

Check If Key Exists using has_key() method

Using has_key() method returns true if a given key is available in the dictionary, otherwise, it returns a false. With the Inbuilt method has_key(), use the if statement to check if the key is present in the dictionary or not.

How do you extract a value from a key in Python? ›

To get the value by the key, just specify the key as follows.
  1. d = {'key1': 'aaa', 'key2': 'aaa', 'key3': 'bbb'} value = d['key1'] print(value) # aaa. source: dict_get_key_from_value.py.
  2. d = {'key1': 'aaa', 'key2': 'aaa', 'key3': 'bbb'} ...
  3. key = [k for k, v in d. ...
  4. def get_keys_from_value(d, val): return [k for k, v in d.
12 Dec 2020

How do you access all the values in a dictionary? ›

We can use the values() method in Python to retrieve all values from a dictionary. Python's built-in values() method returns a view object that represents a list of dictionaries containing every value. This article explains about the various ways to print all the values of a dictionary in Python.

How do you separate a key from a value in a dictionary? ›

Creating a Dictionary

To do that you separate the key-value pairs by a colon(“:”). The keys would need to be of an immutable type, i.e., data-types for which the keys cannot be changed at runtime such as int, string, tuple, etc. The values can be of any type.

How do pandas handle KeyError? ›

How to Fix the KeyError? We can simply fix the error by correcting the spelling of the key. If we are not sure about the spelling we can simply print the list of all column names and crosscheck.

How are the exceptions handled in scripting? ›

You can use the catchError() script operation to catch exceptions in the scripting code, and take the required action that is based on the exception. You can choose to handle the exception programmatically or rethrow the exception to calling code.

Does exception catch SQLException? ›

SQLException is a specialized exception derived from Exception . If you catch Exception , all exception shall get caught. Even undesirable exceptions.

How does Python handle JSON KeyError? ›

To solve the (JSON) KeyError exception in Python, use the json. loads() method to parse the JSON string into a native Python object and conditionally check if the key is present in the dictionary before accessing it.

Why we get KeyError in Python? ›

In this article, we talked about the KeyError in Python. This error is raised when we try to access an item that doesn't exist in a dictionary in Python.

How do you fix KeyError 0 in Python? ›

The Python "KeyError: 0" exception is caused when we try to access a 0 key in a dictionary that doesn't contain the key. To solve the error, set the key in the dictionary before trying to access it or conditionally set it if it doesn't exist.

What is the best way to overcome the exception? ›

Top 10 Java Exception handling best practices
  1. Be careful what you log.
  2. Don't bury thrown exceptions.
  3. Use a global Exception handler.
  4. Don't close resources manually.
  5. Throw early and handle exceptions late.
  6. Don't log and rethrow Java exceptions.
  7. Check for suppressed exceptions.
  8. Explicitly define exception in the throws clause.
9 Sept 2022

How do you overcome exceptions? ›

How to Handle an Exception
  1. a try block that encloses the code section which might throw an exception,
  2. one or more catch blocks that handle the exception and.
  3. a finally block which gets executed after the try block was successfully executed or a thrown exception was handled.
17 Jul 2017

What happens if an exception is thrown and not caught? ›

What happens if an exception is not caught? If an exception is not caught (with a catch block), the runtime system will abort the program (i.e. crash) and an exception message will print to the console.

What happens if exceptions are not properly handled? ›

When an exception occurred, if you don't handle it, the program terminates abruptly and the code past the line that caused the exception will not get executed.

How do you handle multiple exceptions in a single catch? ›

If a catch block handles multiple exceptions, you can separate them using a pipe (|) and in this case, exception parameter (ex) is final, so you can't change it. The byte code generated by this feature is smaller and reduce code redundancy.

How does Python handle JSON data? ›

It's pretty easy to load a JSON object in Python. Python has a built-in package called json, which can be used to work with JSON data. It's done by using the JSON module, which provides us with a lot of methods which among loads() and load() methods are gonna help us to read the JSON file.

How do I query JSON data in Python? ›

Example-1: Search key in simple JSON data

Here, a variable named customerData is defined to store the JSON data. The value of the key will be taken as input from the user. loads() method of JSON module is used to load JSON data in the variable named customer. Next, 'in' operator is used to search the key.

What is JSON decode error in Python? ›

The Python "json. decoder. JSONDecodeError: Extra data" occurs when we try to parse multiple objects without wrapping them in an array. To solve the error, wrap the JSON objects in an array or declare a new property that points to an array value that contains the objects.

Videos

1. Python Tutorial #28 - Exceptions
(Coding Specs)
2. python tutorial: key error in python dictionary - Solved
(Code Fix)
3. Python Exceptions Detailed Tutorial
(IamPython)
4. 7.5 - Learn Python: Handling Exceptions
(NimbusDevOps)
5. #21 Exception Handling In Python- Try, Except,Finally,Raise Keyword- Python Tutorials For Beginners
(Mukesh otwani)
6. Mario Corchero - Exceptional Exceptions - How to properly raise, handle and create them.
(PyCon 2019)
Top Articles
Latest Posts
Article information

Author: Sen. Ignacio Ratke

Last Updated: 01/08/2023

Views: 5638

Rating: 4.6 / 5 (76 voted)

Reviews: 83% of readers found this page helpful

Author information

Name: Sen. Ignacio Ratke

Birthday: 1999-05-27

Address: Apt. 171 8116 Bailey Via, Roberthaven, GA 58289

Phone: +2585395768220

Job: Lead Liaison

Hobby: Lockpicking, LARPing, Lego building, Lapidary, Macrame, Book restoration, Bodybuilding

Introduction: My name is Sen. Ignacio Ratke, I am a adventurous, zealous, outstanding, agreeable, precious, excited, gifted person who loves writing and wants to share my knowledge and understanding with you.