Passthrough关键字参数

2024-04-29 15:12:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个类函数需要“传递”一个特定的关键字参数:

def createOrOpenTable(self, tableName, schema, asType=Table):
    if self.tableExists(tableName):
        return self.openTable(tableName, asType=asType)
    else:
        return self.createTable(self, tableName, schema, asType=asType)

当我调用它时,我得到这样一个错误:

^{pr2}$

有没有办法“传递”这样一个关键字参数?在

我想了好几个答案,但没有一个是最佳的。从最坏到最好:

  • 我可以更改一个或多个函数的关键字名称,但我希望对所有三个函数使用相同的关键字,因为参数具有相同的含义。

  • 我可以通过位置而不是关键字来传递asType参数,但是如果我向openTablecreateTable添加其他关键字参数,我必须记住更改调用。我宁愿它自动适应,因为如果我可以使用关键字形式。

  • 我可以在这里使用**args形式,来获得关键字参数的字典,而不是使用默认参数,但这看起来像是用大锤拍苍蝇(因为需要额外的代码行来正确解析它)。

有更好的解决办法吗?在


Tags: 函数self参数returnifschemadeftable
3条回答

我会在Juergen的帖子上发表评论,但我需要写一个代码示例。这里有一个更通用的版本:

def createOrOpenTable(self, tableName, schema, *args, **argd):
    if self.tableExists(tableName):
        return self.openTable(tableName, *args, **argd)
    else:
        return self.createTable(tableName, schema, *args, **argd)

这将允许位置参数也有效(如果您真的希望这是一个“传递”,这一点很重要

你做得对。。。只需去掉第二个函数调用中的self。)

  return self.createTable(self, tableName, schema, asType=asType)

应该是:

^{pr2}$

我不得不说,我首先想到了一个更复杂的问题。但是大卫·沃利弗的回答是绝对正确的。正是这个复制的自我造成了问题。这样,位置参数就越界了,asType被赋予一个值作为positional参数(一次)和一个关键字参数(第二次!)。在

一个更有趣的问题是,当您想增强被调用的例程(在示例中是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的签名,而不必再更改CreateOrPentable。在

当create和openTable可以有不同的关键字参数时,当然这两个例程都必须定义如下:

^{pr2}$

others参数会占用方法未知的任何关键字参数,也不需要对其求值。在

相关问题 更多 >