*args,**kwargs属于可变参数
args即为arguments,kwargs即为key-word arguments
如果函数参数中有*或**,你想再添加新的参数,把他们放在*或**参数前面
像我想添加args
def get_loss(self, loss, outputs, targets, indices, num_boxes, args=None, **kwargs):
* 会将传入的参数放入名为args的元组中
** 会将传入的参数放入名为kwargs的字典中,仅对关键字参数传入有效def test(a,b,c=3,*args): print(a) print(b) print(c) print(args) test(11,22,33,44,55)
args中保存的是没有利用的所有多余参数,保存方式为元组tuple
def test(a,b,c=3,*args,**kwargs): print(a) print(b) print(c) print(args) print(kwargs) test(11,22,33,dd=44,ee=55,ff=66)
而如果输入多余参数有变量名,就保存在**kwargs中保存,保存方式为字典dict
如果多余参数中既有*args类型,也有**kwargs类型,则分别保存
当我们想基于某个现有的函数,在添加一个参数扩充成我们自己的当前函数
例如wandb函数,pytorch lightning中的WandbLogger就是在wandb本身本身函数的基础上添加了一些pytorch lightning的函数写成的
但是又想让用户在给WandbLogger传参的时候,就可以把wandb哈函数的一些参数直接传进去,就可以用kwargs
class WandbLogger(LightningLoggerBase): def __init__( self, name: Optional[str] = None, save_dir: Optional[str] = None, offline: Optional[bool] = False, id: Optional[str] = None, anonymous: Optional[bool] = None, version: Optional[str] = None, project: Optional[str] = None, log_model: Optional[bool] = False, experiment=None, prefix: Optional[str] = "", **kwargs, ): ...... self._wandb_init.update(**kwargs)