Pasar el diccionario como argumento a la función para ejecutar una con

Pasar el diccionario como argumento a la función para ejecutar una consulta

Tengo una clase llamada base de datos que implementa la funcionalidad de cuajada. Quiero pasar un diccionario como argumento para insertar en una función para ejecutar una consulta.

        import pymysql as my
        class Database(object):
            def __init__(self):
                self.user = 'root'
                self.host = '127.0.0.1'
                self.pwd = ''
                self.db = 'premonition'

                try:
                    self.dbs = my.connect(self.host,self.user,self.pwd,self.db)
                    self.cursor = self.dbs.cursor()
                    print(self.cursor.execute('select version()'))

                except my.Error as error:
                    print ('Error: %s ' %error + '\nStop.\n')

           def insertRow(self,*args,**kwargs):

            sql = "insert into {1} {2}            
            values{3}".format(args,str(kwargs.keys(),str(kwargs.values()))
            try:
                self.cursor.execute(sql)
                self.dbs.commit()
            except Exception as e:
                print("Error during insert:::",e)
db = Database()
db.insertRow(tablename = "test", data ={'roll_id':'251452', 'name': 'Python', 'age': 28})

Cómo ejecutar la consulta lo que obtengo es un error.

File "database.py", line 72, in <module>    
db.insertRow(tablename = "test", data ={'roll_id':'251452', 'name': 'Python', 'age': 28})
File "database.py", line 25, in insertRow    
sql = "insert into {1} {2} values {3}".format(args,str(kwargs.keys(),str(kwargs.values())))
TypeError: coercing to str: need a bytes-like object, dict_keys found
Mostrar la mejor respuesta

No sé si invocar claves() y valores() por separado siempre obtienen el par correcto clave:valor, por lo que puede hacer algo como esto, para asegurarlo

template = "insert into {0} {1} values{2}"
keys = []
values = []

for k,v in d.items():
    keys.append(str(k))
    values.append(str(v))

sql = template.format(some_name, tuple(keys), tuple(values)

de otra manera puede ser solo esto

template.format(some_name, tuple(kwargs.keys()), tuple(kwargs.values())

También puede usar la variable args como desee, tal vez no sea correcto si desea usar el único nombre de la tabla. Quizás debas repensar este código.