Python 根据包装签名传递给金字塔视图函数的参数不一致

Python 根据包装签名传递给金字塔视图函数的参数不一致,python,pyramid,Python,Pyramid,我试图理解传递给金字塔视图函数的参数 下面的示例演示使用两个不同的包装器包装的函数。这两种包装的唯一区别是签名。在第一个包装器中,第一个位置参数(obj)是显式的。在第二种情况下,它包含在*args中 导入工具 从pyramid.config导入配置程序 导入webtest def装饰器_1(功能): @functools.wrapps(func) def wrapper(obj,*args,**kwargs):#我在中分享了我的发现,但以防万一有人在这里看到这一点: Pyramid允许您使用这

我试图理解传递给金字塔视图函数的参数

下面的示例演示使用两个不同的包装器包装的函数。这两种包装的唯一区别是签名。在第一个包装器中,第一个位置参数(
obj
)是显式的。在第二种情况下,它包含在
*args

导入工具
从pyramid.config导入配置程序
导入webtest
def装饰器_1(功能):
@functools.wrapps(func)

def wrapper(obj,*args,**kwargs):#我在中分享了我的发现,但以防万一有人在这里看到这一点:

Pyramid允许您使用这些签名之一编写视图函数

def视图(请求):
...
def视图(上下文、请求):
...
第二个调用约定是原始的,第一个是更新的。因此,即使在中称为“备用”,它也是默认值


他们使用
inspect.getfullargspec
查看视图是否采用单个位置参数,如果采用,则将其包装以匹配第二个约定。如果视图与第一个约定不匹配,则假定它与第二个约定匹配(在本例中为假)。

第二个约定成为默认约定的原因是因为它是历史上的第一个约定-我认为最初更强调遍历,这也是由于金字塔的Zope根。@Sergey,这很有道理,谢谢你的信息!我将对答案进行调整以说明这一点——但我确实认为,如果事情不明确(如本例中),文档将其称为“alternatel调用约定”(alternatel calling convention)是默认值,这有点令人困惑。
decorator_1
<class 'pyramid.request.Request'> GET /func_1 HTTP/1.0
Host: localhost:80
()
{}
decorator_2
(<pyramid.traversal.DefaultRootFactory object at 0x7f981da2ee48>, <Request at 0x7f981da2ea20 GET http://localhost/func_2>)
{}