Python 金字塔:视图可调用项如何接受一个或两个参数?

Python 金字塔:视图可调用项如何接受一个或两个参数?,python,pyramid,Python,Pyramid,以最简单的形式调用的金字塔视图可以写成: def myview(request): pass 另一种形式是接受另一个参数——上下文: def myview(context, request): pass 金字塔视图查找机制如何知道视图可调用是否接受上下文?金字塔使用inspect模块检查视图(特别是在以下位置调用.getargspec(): 然后,如果视图不接受上下文,其余代码将调整代码路径以忽略上下文。您可以链接到Pyramid github source上发生这种情况的位

以最简单的形式调用的金字塔视图可以写成:

def myview(request):
    pass
另一种形式是接受另一个参数——上下文:

def myview(context, request):
    pass

金字塔视图查找机制如何知道视图可调用是否接受上下文?

金字塔使用
inspect
模块检查视图(特别是在以下位置调用
.getargspec()


然后,如果视图不接受上下文,其余代码将调整代码路径以忽略上下文。

您可以链接到Pyramid github source上发生这种情况的位置吗?()可能在这里:谢谢。因此添加路由将运行检查(正如@Martijn指出的),然后将视图“包装”为标准化调用,并通过
DefaultViewMapper
router.py
()将其存储在注册表中,具有
router.handle\u request
方法,该方法使用两个参数调用映射(标准化)请求
response=view\u callable(上下文,请求)
。实际上,我也一直对如何完成这项工作感兴趣。很高兴他们通过
DefaultViewMapper
标准化优化了检查。@JonathanVanasco:是的,我很抱歉;不得不离开一会儿。
def requestonly(view, attr=None):
    ismethod = False
    if attr is None:
        attr = '__call__'
    if inspect.isroutine(view):
        fn = view
    elif inspect.isclass(view):
        try:
            fn = view.__init__
        except AttributeError:
            return False
        ismethod = hasattr(fn, '__call__')
    else:
        try:
            fn = getattr(view, attr)
        except AttributeError:
            return False

    try:
        argspec = inspect.getargspec(fn)
    except TypeError:
        return False

    args = argspec[0]

    if hasattr(fn, im_func) or ismethod:
        # it's an instance method (or unbound method on py2)
        if not args:
            return False
        args = args[1:]
    if not args:
        return False

    if len(args) == 1:
        return True

    defaults = argspec[3]
    if defaults is None:
        defaults = ()

    if args[0] == 'request':
        if len(args) - len(defaults) == 1:
            return True

    return False