Я должен сказать, что сначала подумал о более сложной проблеме. Но ответ Дэвида Волера абсолютно верен. Это просто дублирующая личность, которая создает проблему. Таким образом, позиционные параметры выходят за пределы строки, и asType присваивается значение в качестве опционного параметра (один раз) и ключевого параметра (второй раз!).
Гораздо более интересная проблема состоит в том, что делать, когда вы хотите улучшить вызываемую подпрограмму (в примере createTable), не улучшая при этом промежуточную функцию. Здесь решение ** args делает хитрость:
Например:
def createOrOpenTable(self, tableName, schema, **args):
if self.tableExists(tableName):
return self.openTable(tableName, **args)
else:
return self.createTable(tableName, schema, **args)
Таким образом, можно улучшить сигнатуру createTable и openTable, больше не меняя createOrOpenTable.
Когда create и openTable могут иметь разные ключевые слова-параметры, тогда, конечно, обе процедуры должны быть определены следующим образом:
def createTable(self, tableName, schema, asType=None, **others):
...
Параметр others съедает любые ключевые параметры, неизвестные методу - его также не нужно оценивать.