Implementing hash table in Python using Tuples
Despite the code produce the desired output in your simple test case, your implementation is quite flawed.
a = hash_table(size)

insert_hash(a, 1, 'john')
insert_hash(a, 2, 'edward')
delete_hash(a, 1)
print_hash(a, 2)

Output:
Traceback (most recent call last):
  File &quot;C:/Code Review/hash_table.py&quot;, line 53, in &lt;module&gt;
    print_hash(a, 2)
  File &quot;C:/Code Review/hash_table.py&quot;, line 30, in print_hash
    while table[index][0] != key:      #in case there is a collision:
TypeError: 'NoneType' object is not subscriptable
&gt;&gt;&gt; 

The issue: table.pop(index) will move items after the one being delete forward by one position in the table.  Given that they are indexed by the hash values, this would mean that they can't be found anymore.
a = hash_table(size)

for _ in range(2000):
    insert_hash(a, 1, 'john')
    delete_hash(a, 1)

Output:
Traceback (most recent call last):
  File &quot;C:/Code Review/hash_table.py&quot;, line 51, in &lt;module&gt;
    insert_hash(a, 1, 'john')
  File &quot;C:/Code Review/hash_table.py&quot;, line 22, in insert_hash
    if table[index] == None:
IndexError: list index out of range
&gt;&gt;&gt; 

After each insert/delete, the table size has shrunk by one item.  After a thousand insert/deletes, the table can't hold any values!
a = hash_table(size)

insert_hash(a, 999, 'john')
insert_hash(a, 999, 'edward')

Output:
Traceback (most recent call last):
  File &quot;C:/Code Review/hash_table.py&quot;, line 51, in &lt;module&gt;
    insert_hash(a, 999, 'edward')
  File &quot;C:/Code Review/hash_table.py&quot;, line 25, in insert_hash
    collision_handler(table, index, item)
  File &quot;C:/Code Review/hash_table.py&quot;, line 42, in collision_handler
    while table[index] != None:
IndexError: list index out of range
&gt;&gt;&gt; 

A collision at the last slot in the hash table doesn't have room to handle the collision, despite the table only having a 999 empty slots.  You need to use circular addressing.
You need to add more test cases, and rework the code to handle these issues.  I generated these issues quickly by exploiting the fact that hash(int) == int for sufficiently small integers, but they would arise using strings for keys as well.  It is just be harder to generate cases which deterministicly fail using string keys.