Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 金字塔视图的自定义装饰器:是否忽略视图函数?_Python_Decorator_Pyramid_Python Decorators - Fatal编程技术网

Python 金字塔视图的自定义装饰器:是否忽略视图函数?

Python 金字塔视图的自定义装饰器:是否忽略视图函数?,python,decorator,pyramid,python-decorators,Python,Decorator,Pyramid,Python Decorators,在我的金字塔代码中,我为不同的路由和模板多次注册函数。因此,我的应用程序以不同的格式/视图显示相同的数据: class MyViews(object): @view_config(route_name='A', renderer='A') @view_config(route_name='B', renderer='B') @view_config(route_name='C', renderer='C') @view_config(route_name='D',

在我的金字塔代码中,我为不同的路由和模板多次注册函数。因此,我的应用程序以不同的格式/视图显示相同的数据:

class MyViews(object):
    @view_config(route_name='A', renderer='A')
    @view_config(route_name='B', renderer='B')
    @view_config(route_name='C', renderer='C')
    @view_config(route_name='D', renderer='D')
    def my_view(self):
        return results
这很好,但是因为我有很多这样的情况遵循某个模式,所以我想简化我的代码如下:

def entity_search_method(type_name):
    def decorator(fkt):
        fkt = view_config(route_name = A % type_name, ...)(fkt)
        fkt = view_config(route_name = B % type_name, ...)(fkt)
        fkt = view_config(route_name = C % type_name, ...)(fkt)
        fkt = view_config(route_name = D % type_name, ...)(fkt)
        return fkt
    return decorator
然后:

class MyViews(object):
    @entity_search_method('some_type')
    def my_view(self):
        return results
在我的理解中,这应该与直接呼叫装饰者完全相同。我甚至不需要关心
functools.wrap
之类的东西,因为我自己甚至不生成新函数。但金字塔忽略了这个方法。有什么提示我可能遗漏了什么吗?

你没有申请装饰师;调用'view_config()的返回值,传入要装饰的项:

def entity_search_method(type_name):
    def decorator(fkt):
        fkt = view_config(route_name = A % type_name, ...)(fkt)
        fkt = view_config(route_name = B % type_name, ...)(fkt)
        fkt = view_config(route_name = C % type_name, ...)(fkt)
        fkt = view_config(route_name = D % type_name, ...)(fkt)
        return fkt
    return decorator
@view\u config(route\u name='D',renderer='D')
语法获取表达式的返回值,并使用源代码中定义的下一个对象(另一个装饰器的函数或输出)调用它,返回值替换要装饰的对象

换言之,以下各项:

@some_expression
def some_function():
    pass
变成:

def some_function():
    pass
some_function = some_expression(some_function)

但是金字塔视图装饰器本身就是返回装饰器函数的可调用函数。

view\u config
而获取这些装饰器的底层库有点棘手。我认为您在这里缺少的是,您需要指定一个
view\u config(…,\u depth=1)
来向金星人表明装饰器已经包装好了。深度是相对于
view\u config
decorator的使用,您正在修饰的实际函数(在堆栈帧中)的位置的指示器。

对不起,我更新了我的问题。你是对的,但这正是我在代码中所做的。我只是在复制和减少代码时犯了一个错误。我应用了decorators,但仍然忽略了该方法。如果在该decorator之上手动应用相同的decorator,会发生什么?所以把它们放在
@entity\u search\u方法('some\u type')
行之前?这样很好。如果我把自己的放在其他参数之上,它也可以工作。您使用的参数是否与自定义装饰器生成的参数完全相同?这段代码中没有任何东西意味着没有应用decorator。在我最初的decorator中,我当然使用
键入\u name
来生成参数。出于测试目的,我硬编码了与手动解决方案完全相同的值。但它仍然不起作用。在我的理解中,我的代码应该与装饰程序的手动应用程序完全相同。所以一定是发生了一些非常奇怪/愚蠢的事情。但我不明白!?谢谢,这解决了我的问题。因为我将来可能会做更多的工作:你能给我指一些文档,让我能够准确地理解正在发生的事情吗?就view_config而言,它在这里的API中有文档记录,但缺少用于扩展/包装的叙述性文档。金星人似乎也缺少深度方面的文档。希望能解决这个问题。