1

我正在使用谷歌教室 api,函数的参数之一需要回调。

def callback(request_id, response, exception):
    if exception is not None:
        print 'Error adding user "{0}" to the course course: {1}'.format(
            request_id, exception)
    else:
        print 'User "{0}" added as a student to the course.'.format(
            response.get('profile').get('name').get('fullName'))

在我的情况下,该方法在一个类中,并且我知道每个 python 方法都应该采用一个 self 对象,但是在这种情况下,这个函数将具有特定的参数,我不确定如何传递 self 对象或者我应该忽略 self 吗?问题是我计划在函数内部使用 self 。有任何想法吗?

4

1 回答 1

1

我想我理解你的困境。继续并包含self作为第一个参数,因为每次callback()调用它都会由 Python 隐式传递。所有其他位置参数(request_idresponseexception都不会受到self方法参数定义中包含的影响。IE:

def callback(self, request_id, response, exception):
    # ...

如果你不打算self在方法中使用对象callback(现在是函数),那么你可以@staticmethod在函数的定义上使用装饰器,但如果我直接跟着你,那不是这里的情况。

编辑:如果您需要在不影响回调性质的情况下传递特定参数,您可以使用模块中partial的 , 。functools我会做如下的事情(在这个例子中,我使用了参数request_id,但它可以是任何其他的):

from functools import partial

partial_callback = partial(callback, request_id='12345')

现在您可以传递partial_callback而不是传递callback需要传递特定参数(request_id在我的示例中)的任何地方。

请注意:如果要传递原始函数中未定义的参数callback,则会引发TypeError. 如果是这种情况,则callback使用特殊语法重新定义 ,**kwargs以便callback现在接受一个带关键字的可变长度参数,该参数将作为键值对存储在名为 的字典中kwargs

请注意,为了在函数定义中使用参数,您必须将它们称为kwargs['whatever_argument_name'](就像使用任何字典一样)

因此,例如,如果你想传递一个名为 的参数extraparam,那么你需要有如下内容:

def callback(self, request_id, response, exception, **kwargs):
    # ...
    extraparam = kwargs.get('extraparam')
    if extraparam is not None:
        # ...

partial_callback = partial(callback, extraparam='whatever')

于 2020-06-06T16:21:27.723 回答